首页 > 解决方案 > 如何将两个对象与一个对象的某些属性和另一个对象的其他属性合并?

问题描述

我有两个对象(有些可能称为字典),如下所示:

object1 = 
{
     id123: 
     {
           name: Copenhagen,
           type: 'city'
     }
}

object2 = 
{
     id123: 
     {
           name: Copenhagen,
           type: 'county',
           props: { id1: true, id: false}
     },
     id1234: 
     {
           name: Pars,
           type: 'county',
           props: { id1: true, id: false}
     },
     id12345: 
     {
           name: London,
           type: 'county',
           props: { id1: true, id: false}
     },
}

如果两个 id 相同,我的合并对象需要从 object1 中获取类型,并且需要保留来自 object2 的道具,如下所示(注意哥本哈根):

mergedObjects = 
{
     id123: 
     {
           name: Copenhagen,
           type: 'city',
           props: { id1: true, id: false}
     },
     id1234: 
     {
           name: Pars,
           type: 'county',
           props: { id1: true, id: false}
     },
     id12345: 
     {
           name: London,
           type: 'county',
           props: { id1: true, id: false}
     },
}

我用传播运算符尝试了以下操作:

mergedObjects = { ...object2, ...object1 }

但是整个 id 对象被替换,而不是合并。你能帮我吗?

标签: javascriptobject

解决方案


通过 object2 键,将值添加到合并并type从 object1 更新,如果它们使用了 object2 的类型。

const object1 = {
  id123: {
    name: 'Copenhagen',
    type: "city"
  }
};

const object2 = {
  id123: {
    name: 'Copenhagen',
    type: "county",
    props: { id1: true, id: false }
  },
  id1234: {
    name: 'Pars',
    type: "county",
    props: { id1: true, id: false }
  },
  id12345: {
    name: 'London',
    type: "county",
    props: { id1: true, id: false }
  }
};

const merged = {};
Object.keys(object2).forEach(key => {
  merged[key] = { ...object2[key], type: object1[key] ? object1[key].type : object2[key].type };
});

console.log(merged);


推荐阅读