Я пытаюсь создать функцию, которая принимает целевой json объект исходный json объект (обновление). Правило состоит в том, что цель должна обновляться источником. Если ключи такие же, значение цели перезаписывается. Если ключ содержит точку .
, мы рассматриваем его как вложенное обновление (пример 3). Если ключ обновления не существует в целевом объекте, мы создаем его.
Пример 1:
var target = {
foo: 1,
}
var source = {
foo: 22,
}
var output = {
foo: 22
}
Пример 2:
var target = {
foo: {
bar: 1
},
}
var source = {
foo: {
baz: 999
},
}
var output = {
foo: {
baz: 999
}
}
Пример 3:
var target = {
foo: {
bar: 1,
baz: 99,
},
}
var source = {
'foo.bar': 22,
}
var output = {
foo: {
bar: 22,
baz: 99
}
}
Пример 4 (Массив)
Мы предполагаем, что числа являются недопустимым ключом для источника. Например, приведенный ниже источник никогда не появится
// this will never happen
let source = {
1: 'something'
}
Однако обновление может обновить значение массива по указанному индексу, используя метод точки .
const source = {
foo: [0, 1,2,3, {four: 4}]
}
const target = {
'foo.0': 'zero',
'foo.4.four': 'four',
'foo.4.five': 5,
}
const output = {
foo: ['zero', 1, 2, 3, {four: 'four', five: 5}]
}
Следовательно, массив не может изменить размер с помощью обновления точки, чтобы изменить размер, нам нужно перезаписать весь массив
Моя функция ниже отлично работает с примером 1, но я не могу заставить ее работать с примерами 2 и 3 .
Вместо этого я получаю:
var example2 = {
bar: 1,
baz: 999,
}
var example3 = {
foo: {
bar: 1,
baz: 99,
},
'foo.bar': 22,
}
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;
}