| 123456789101112131415161718192021222324252627282930313233343536373839404142434445 |
- /**
- * Глубокое объединение двух объектов.
- *
- * Если оба значения массивы, то выполняется объединение.
- * Если оба значения объекты, то выполняется объединение.
- * В остальных случаях значение из source перезаписывает target.
- *
- * @param {*} target
- * @param {*} source
- * @returns {*}
- */
- export function mergeDeep(target, source) {
- const isObject = item => {
- return item && typeof item === 'object' && !Array.isArray(item);
- };
- // если оба значения массивы, то возвращается
- // новый массив с их объединением
- if (Array.isArray(target) && Array.isArray(source)) {
- return [...target, ...source];
- }
- // если оба значения объекты,
- // то выполняется глубокое слияние
- if (isObject(target) && isObject(source)) {
- // создание поверхностной копии первого объекта
- const result = {...target};
- // обход ключей второго объекта
- Object.keys(source).forEach(key => {
- const targetValue = target[key];
- const sourceValue = source[key];
- // если ключ есть и в первом объекте,
- // то выполняется объединение их значений
- if (Object.prototype.hasOwnProperty.call(target, key)) {
- result[key] = mergeDeep(targetValue, sourceValue);
- } else {
- // если ключа нет в первом объекте,
- // то берется значение из второго
- result[key] = sourceValue;
- }
- });
- return result;
- }
- // во всех остальных случаях значение
- // из source перезаписывает target
- return source;
- }
|