如何合并两个对象的对象值

Tai*_*chi 2 javascript object ecmascript-6 lodash

我有两个这样的对象并想合并它们:

const obj1 = {
  1: { foo: 1 },
  2: { bar: 2, fooBar: 3 },
  3: { fooBar: 3 },
};

const obj2 = {
  1: { foo: 1, bar: 2 },
  2: { bar: 2 },
};

const merged = someMergingMethod(obj1, obj2);

merged === {
  1: { foo: 1, bar: 2 },
  2: { bar: 2, fooBar: 3 },
  3: { fooBar: 3 },
};
Run Code Online (Sandbox Code Playgroud)

我的意思是,我不仅要合并对象,还要合并对象值的属性(如果键重复)。因为只是merged = { ...obj1, ...obj2 };用 obj2 覆盖了属性。

什么是最简单的方法来做到这一点?

我可以使用 ES2017 和其他库,如 lodash。

Cod*_*iac 5

您可以使用扩展运算符。

更新 :

如果 obj2 有一些 obj1 没有的属性?

最初我写了这个答案,假设键被索引,0,1 and so on但正如你在评论中提到的,情况并非如此,你可以构建一个键数组,然后将其迭代为

正如@Nick 在评论中非常简洁地添加的那样 [...Object.keys(obj1), ...Object.keys(obj2)]

let obj1 = {1: { foo: 1 },2: { bar: 2, fooBar: 3 },3: { fooBar: 3 },};
let obj2 = {1: { foo: 1, bar: 2 },2: { bar: 2 },};

let keys = [...new Set([...Object.keys(obj1),...Object.keys(obj2)])]
let  op = {}
let merged = keys.forEach(key=>{
  op[key] = {
    ...obj1[key],
    ...obj2[key]
  }
})
console.log(op)
Run Code Online (Sandbox Code Playgroud)

  • @Taichi 不是答案的原始作者,但我认为通过将 `Objects.keys(obj1).forEach` 更改为 `[...Object.keys(obj1), ...Object.keys(obj2)].forEach`应该做的伎俩 (3认同)
  • @CodeManiac 不用担心,只是另一个想法,也许通过设置键等于 `[...new Set([...Object.keys(obj1),...Object.keys(obj2)])];` 将是最好删除重复项......另外,我认为`merged`应该是`merged = keys.forEach()`;) (2认同)