首页 > 解决方案 > 如何合并两个对象的对象值

问题描述

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

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 },
};

我的意思是,我不仅想合并对象,而且如果键被复制,还想合并它们的对象值的属性。因为只是merged = { ...obj1, ...obj2 };用 obj2 覆盖了属性。

最简单的方法是什么?

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

标签: javascriptobjectecmascript-6lodash

解决方案


您可以使用扩展运算符。

更新 :

如果 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)


推荐阅读