Если вы хотите создать собственную стратегию слияния, возможно, вы сможете написать собственную рекурсивную функцию. В рекурсивной функции вы в основном передаете свою цель и свой источник. Исходя из вашего вопроса, цель будет obj1
, а источник будет obj2
.
Ваш лог c таков:
- Если
obj1
нет содержит ключ, который находится в obj2
, мы сохраняем пару ключ-значение из obj1
, источник - Если
obj1
содержит ключ obj2
, то: - Если они просто не являются объектами, мы допускаем переопределение значения
obj2
obj1
value - Если они оба являются объектами, то мы снова вызываем одну и ту же рекурсивную функцию
См. Подтверждение концепции ниже:
const obj1 = {
a1: {
b1: 2
},
a2: 5
}
const obj2 = {
a1: {
b1: 4,
b2: 9
},
a3: 6
}
function smartMerge(target, source) {
const o = {};
// Iterate throught all keys in your target
for(let k in target) {
// If a matching key is found in source
if (k in source) {
// If they are both objects, then we run recurisve merge logic
if (typeof target[k] === 'object' && typeof source[k] === 'object') {
o[k] = smartMerge(target[k], source[k]);
}
// Otherwise, we let the source override the value
else {
o[k] = source[k];
}
}
// If no matching key is found, we keep the target value
else {
o[k] = target[k];
}
}
return o;
}
const result = smartMerge(obj1, obj2);
/* Expected:
{
a1: {
b1: 4
},
a2: 5
}
*/
console.log(result);
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.15/lodash.min.js"></script>