将两个复杂对象组合在一起是行不通的:Javascript

Clubbing both complex objects does not work: 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 级。我唯一需要的是对 "nested" 对象进行操作。如果存在相同的键,则更新该值,否则只需附加它。此外,obj2 的 "nested" 中的内容将始终存在于 obj1 的 "nested" 中。如果 obj2 的 "nested" 的某些内容不存在于 obj1 的 "nested" 中,则删除该对象。沙箱内附加的测试用例文件

输出应如下所示:

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

只是 google "deep merge javascript" 或 "merge nested objects"。 Here 是我发现的一个例子:

// 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));