Вы можете использовать функцию глубокого слияния для каждого уровня объекта.
Функция deepMerge
работает как отдельная функция для заданной цели или как обратный вызов для Array#reduce
, где массив объектов повторяется и пустой объект предоставляется как startvalue
для сокращения.
Функция / обратный вызов itselft имеет два параметра: один для целевого объекта и один для исходного объекта, где все записи взяты и повторены.
Проверяется значение объекта, и если тип является объектом, то рекурсивный вызов deepMerge
выполняется с новым целевым свойством, если оно не задано, или со свойством exitent.
Если значение не является объектом, значение присваивается target
с заданным ключом.
Результатом является новый объект со всеми свойствами заданных объектов.
function deepMerge(target, source) {
Object.entries(source).forEach(([key, value]) => {
if (value && typeof value === 'object') {
deepMerge(target[key] = target[key] || {}, value);
return;
}
target[key] = value;
});
return target;
}
var a = { prop: { a: '1' } },
b = { prop: { b: '1' } },
c = [a, b].reduce(deepMerge, {});
console.log(c);