将两个复杂对象都合并是行不通的:Javascript



>我有一个具有以下结构的源对象

var obj1 = {
type: "type1",
nested: {
level1: [
{ field: "field1", value: "val1"},
{ field: "field2", value: "val2"},
{
level2: [
{
field: "abc",
value: "11",
},
{
field: "abc",
value: "12",
}
]
}
]
},
in: 0,
out: 20
};

还有一个输入对象,基于该对象进行合并

var obj2 = {
type: "type1",
nested: {
level1: [
{ field: "field1", value: "val1"},
{ field: "field3", value: "val5" }
]
},
in: 0,
out: 20
};

基于我需要合并的新对象,结果应该只保存唯一的对象。在我的情况下,对象可以深入到级别 2。我唯一需要的是对"嵌套"对象的操作。如果存在相同的键,则更新值,否则只需附加它。此外,obj2 的"嵌套"中的内容将始终存在于 obj1 的"嵌套"中。如果 obj2 的"嵌套"中不存在 obj2 的"嵌套",则删除该对象。沙盒内附加的测试用例文件

输出应如下所示:

result = {
type: "type1",
nested: {
level1: [
{ field: "field1", value: "val1"},
{ field: "field2", value: "val2"},
{ field: "field3", value: "val5" },
{
level2: 
[
{
field: "abc",
value: "11",
},
{
field: "abc",
value: "12",  
}
]
}
]
},
in: 0,
out: 20
};

我尝试过的方法:

const merged = [...new Set([...obj1.nested.level1, ...obj2.nested.level1])]

沙盒:https://codesandbox.io/s/angry-liskov-e5m1m

只需谷歌"深度合并javascript"或"合并嵌套对象"。这是我发现的一个例子:

// Merge a `source` object to a `target` recursively
const merge = (target, source) => {
// Iterate through `source` properties and if an `Object` set property to merge of `target` and `source` properties
for (const key of Object.keys(source)) {
if (source[key] instanceof Object) Object.assign(source[key], merge(target[key], source[key]))
}
// Join `target` and modified `source`
Object.assign(target || {}, source)
return target
}
console.log(merge(obj1, obj2));

最新更新