daily pastebin goal
40%
SHARE
TWEET

Untitled

a guest Apr 16th, 2018 48 Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. // @flow
  2.  
  3. const hasOwnProperty = Object.prototype.hasOwnProperty;
  4. const toString = Object.prototype.toString;
  5.  
  6. /**
  7.  * Проверяет, что переданный объект является "плоским" (т.е. созданным с помощью "{}"
  8.  * или "new Object").
  9.  *
  10.  * @param {Object} obj
  11.  * @returns {Boolean}
  12.  */
  13. function isPlainObject(obj) {
  14.     if (toString.call(obj) !== '[object Object]') {
  15.         return false;
  16.     }
  17.  
  18.     const prototype = Object.getPrototypeOf(obj);
  19.     return prototype === null ||
  20.         prototype === Object.prototype;
  21. }
  22.  
  23. /**
  24.  * Копирует перечислимые свойства одного или нескольких объектов в целевой объект.
  25.  *
  26.  * @param {Boolean} [deep=false] При значении `true` свойства копируются рекурсивно.
  27.  * @param {Object} target Объект для расширения. Он получит новые свойства.
  28.  * @param {...Object} objects Объекты со свойствами для копирования. Аргументы со значениями
  29.  *      `null` или `undefined` игнорируются.
  30.  * @returns {Object}
  31.  */
  32. function extend<T, T2, T3, T4, T5, T6, T7, T8, T9>(arg1: T | T2, arg2: T2 | T3, arg3?: T3 | T4, arg4?: T4 | T5, arg5?: T5 | T6, arg6?: T6 | T7, arg7?: T7 | T8, arg8?: T8 | T9, arg9?: T9): T & T2 {
  33.     const args = arguments;
  34.     let target = args[0];
  35.     let deep: boolean;
  36.     let i;
  37.  
  38.     // Проверяем допустимые типы
  39.     if (typeof target === 'string' || typeof target === 'number' || target === null || target === undefined) {
  40.         throw new Error('Функция extend() ожидает на вход массивы или объекты');
  41.     }
  42.  
  43.     // Обрабатываем ситуацию глубокого копирования.
  44.     if (typeof target === 'boolean') {
  45.         deep = target;
  46.         target = args[1];
  47.         i = 2;
  48.     } else {
  49.         deep = false;
  50.         i = 1;
  51.     }
  52.  
  53.     for (; i < arguments.length; i++) {
  54.         const obj = args[i];
  55.         if (!obj) {
  56.             continue;
  57.         }
  58.  
  59.         for (const key in obj) {
  60.             if (hasOwnProperty.call(obj, key)) {
  61.                 const val = obj[key];
  62.                 const isArray = val && Array.isArray(val);
  63.  
  64.                 // Копируем "плоские" объекты и массивы рекурсивно.
  65.                 if (deep && val && (isPlainObject(val) || isArray)) {
  66.                     const src = target[key];
  67.                     let clone;
  68.                     if (isArray) {
  69.                         clone = src && Array.isArray(src) ? src : [];
  70.                     } else {
  71.                         clone = src && isPlainObject(src) ? src : {};
  72.                     }
  73.                     target[key] = extend(deep, clone, val);
  74.                 } else {
  75.                     target[key] = val;
  76.                 }
  77.             }
  78.         }
  79.     }
  80.  
  81.     return target;
  82. };
RAW Paste Data
We use cookies for various purposes including analytics. By continuing to use Pastebin, you agree to our use of cookies as described in the Cookies Policy. OK, I Understand
 
Top