Javascript 如何按键合并两个对象数组,并在单个对象数组中保留唯一的键?

Javascript 如何按键合并两个对象数组,并在单个对象数组中保留唯一的键?,javascript,Javascript,我想合并两个对象数组,其中具有相同ID的对象将合并属性,具有唯一ID的对象将成为合并数组中自己的对象。下面的代码完成了第一部分,类似的ID将合并,但是如何在合并的数组中保留arr2中具有唯一ID的对象,并使其与不同长度的数组一起工作 预期产出: [ { "id": "1", "date": "2017-01-24", "name": "test"

我想合并两个对象数组,其中具有相同ID的对象将合并属性,具有唯一ID的对象将成为合并数组中自己的对象。下面的代码完成了第一部分,类似的ID将合并,但是如何在合并的数组中保留arr2中具有唯一ID的对象,并使其与不同长度的数组一起工作

预期产出:

[
  {
    "id": "1",
    "date": "2017-01-24",
    "name": "test"
  },
  {
    "id": "2",
    "date": "2017-01-22",
    "bar": "foo"
  }
  { "id": "3",
    "foo": "bar",
  }
]
守则:

让arr1=[{
id:'1',
创建日期:“2017-01-24”
},
{
id:'2',
创建日期:“2017-01-22”
},
];
设arr2=[{
id:'1',
名称:“测试”
},
{
id:'3',
福:“酒吧”
},
{
id:'2',
酒吧:“富”
},
];
让合并=[];
for(设i=0;iitmInner.id==arr1[i].id),
},
);
}

console.log(合并)迭代较大的数组,即包含较小数组的数组:

让arr1=[{id:“1”,createdDate:“2017-01-24”},{id:“2”,createdDate:“2017-01-22”},arr2=[{id:“1”,name:“test”},{id:“3”,foo:“bar”},{id:“2”,bar:“foo”};
const merged=arr2.map(项=>({
…arr1.find(({id})=>id==item.id),
…项目
}));

console.log(合并)
您可以创建包含
arr1
arr2
元素的新对象,按
id
键分组,如下所示,合并的数组将存储在对象值上

您可以使用
object.values
func获取对象值

让arr1=[{
id:'1',
创建日期:“2017-01-24”
},
{
id:'2',
创建日期:“2017-01-22”
},
];
设arr2=[{
id:'1',
名称:“测试”
},
{
id:'3',
福:“酒吧”
},
{
id:'2',
酒吧:“富”
},
];
constgroupbyid={};
for(设i=0;iconsole.log(合并)
您可以采用单循环方法,将对象存储在按
id
排序的哈希表中

const
mergeTo=(目标,对象={})=>o=>{
如果(!objects[o.id])target.push(objects[o.id]={});
分配(对象[o.id],o);
},
array1=[{id:'1',createdDate:'2017-01-24'},{id:'2',createdDate:'2017-01-22'}],
array2=[{id:'1',name:'test'},{id:'3',foo:'bar'},{id:'2',bar:'foo'}],
合并=[],
合并=合并到(合并);
阵列1.forEach(合并);
array2.forEach(合并);
console.log(合并)

.as console wrapper{max height:100%!important;top:0;}
可以按原样合并两个数组,然后“挤压”它:

让arr1=[{
id:'1',
创建日期:“2017-01-24”
},
{
id:'2',
创建日期:“2017-01-22”
},
];
设arr2=[{
id:'1',
名称:“测试”
},
{
id:'3',
福:“酒吧”
},
{
id:'2',
酒吧:“富”
},
];
让merged=[…arr1,…arr2]。减少(
(acc,{id,…props})=>
(acc.set(id,{…(acc.get(id)|{}),…props}),acc),newmap();

console.log([…merged].map([id,props])=>({id,…props}))
您可以编写一个函数,将数组缩减为一个对象,然后从该对象提取值,该值将返回您想要的值。您可以看到下面的代码:

let arr1 = [
  {
    id: '1',
    createdDate: '2017-01-24',
  },
  {
    id: '2',
    createdDate: '2017-01-22',
  },
];

let arr2 = [
  {
    id: '1',
    name: 'test',
  },
  {
    id: '3',
    foo: 'bar',
  },
  {
    id: '2',
    bar: 'foo',
  },
];

function merge(arr1 = [], arr2 = []) {
  return Object.values(
    arr1.concat(arr2).reduce(
      (acc, curr) => ({
        ...acc,
        [curr.id]: { ...(acc[curr.id] ?? {}), ...curr },
      }),
      {}
    )
  );
}

const merged = merge(arr1, arr2);
输出:

[
  {
    "id": "1",
    "createdDate": "2017-01-24",
    "name": "test"
  },
  {
    "id": "2",
    "createdDate": "2017-01-22",
    "bar": "foo"
  },
  {
    "id": "3",
    "foo": "bar"
  }
]

因此,如果我不知道哪个数组更大,我需要首先比较长度?前提是您确定其中一个数组包含较小数组也包含的所有ID。否则,请改用中间对象技术。