Javascript 将数组中对象中的一个键与另一个数组中对象中的另一个键进行比较,如果值相等,则将它们合并在一起

Javascript 将数组中对象中的一个键与另一个数组中对象中的另一个键进行比较,如果值相等,则将它们合并在一起,javascript,arrays,array-merge,Javascript,Arrays,Array Merge,我有两个阵列: var array1 = [ { id: 1, name: 'Name 1' }, { id: 2, name: 'Name 2' }, ... ]; var array2 = [ { someId: '1', someField: 'Some Value 1' }, { someId: '2', someField: 'Some Value 2' }, ... ]; array1将有30个来自后端的对象。一旦我得到一个批,我就从这个数组中提取id,并

我有两个阵列:

var array1 = [
  { id: 1, name: 'Name 1' },
  { id: 2, name: 'Name 2' },
  ...
];

var array2 = [
  { someId: '1', someField: 'Some Value 1' },
  { someId: '2', someField: 'Some Value 2' },
  ...
];
array1
将有30个来自后端的对象。一旦我得到一个批,我就从这个数组中提取
id
,并调用另一个API来获取这些id的
array2

最后,我想要一个这样的数组:

var array3 = [
  { id: 1, name: 'Name 1', someOtherField: 'Some Value 1' },
  { id: 2, name: 'Name 2', someOtherField: 'Some Value 2' },
  ...
];
ids = array1.map(item => item.id);
var resultingArray = array2.map((item, index) => {
  return array1[index].someOtherField = item.someField
});
我可以这样做:

var array3 = [
  { id: 1, name: 'Name 1', someOtherField: 'Some Value 1' },
  { id: 2, name: 'Name 2', someOtherField: 'Some Value 2' },
  ...
];
ids = array1.map(item => item.id);
var resultingArray = array2.map((item, index) => {
  return array1[index].someOtherField = item.someField
});
但由于我分批处理了array1的项目,因此很难正确维护索引


如何执行此操作?

阵列2
ID建立一个查找表:

 const ids = new Map(array2.map(el => [el.id, /*to*/ el]));
然后从
array1
添加数据非常简单:

 for(const el of array2) {
   if(ids.has(el.id)) {
      // Merge properties
     Object.assign(ids.get(el.id), el);
   } else {
     // Add to Map and array
     array1.push(el);
     ids.set(el.id, el);
  }
}

array2
id建立查找表:

 const ids = new Map(array2.map(el => [el.id, /*to*/ el]));
然后从
array1
添加数据非常简单:

 for(const el of array2) {
   if(ids.has(el.id)) {
      // Merge properties
     Object.assign(ids.get(el.id), el);
   } else {
     // Add to Map and array
     array1.push(el);
     ids.set(el.id, el);
  }
}

您可以组合这两个数组,并与某些数组一起使用,将
id
someId
作为
id
,并将所有内容存储在字典(POJO)中。我们通过在字典上使用获得一个数组:

const array1=[{id:1,name:'name 1'},{id:2,name:'name 2'}];
const array2=[{someId:'1',someField:'Some Value 1'},{someId:'2',someField:'Some Value 2'}];
const result=Object.values(
//合并两个阵列
[…阵列1,…阵列2]
//使用destructuring将someId/id作为id,并将其他对象的道具
.reduce((r,{someId,id=someId,…rest})=>({
…r,//展开上一个累加器
[id]:{id,…r[id],…rest}//添加当前对象,以及id、props和以前的数据(如果有)
}), {})
);

控制台日志(结果)
您可以组合这两个数组,并与某些数组一起使用,以将
id
someId
作为
id
,并将所有内容存储在字典(POJO)中。我们通过在字典上使用获得一个数组:

const array1=[{id:1,name:'name 1'},{id:2,name:'name 2'}];
const array2=[{someId:'1',someField:'Some Value 1'},{someId:'2',someField:'Some Value 2'}];
const result=Object.values(
//合并两个阵列
[…阵列1,…阵列2]
//使用destructuring将someId/id作为id,并将其他对象的道具
.reduce((r,{someId,id=someId,…rest})=>({
…r,//展开上一个累加器
[id]:{id,…r[id],…rest}//添加当前对象,以及id、props和以前的数据(如果有)
}), {})
);

控制台日志(结果)请您对此做一些解释好吗?我对
Map
相当陌生,以前从未使用过它。@SiddAjmera我不能告诉你更多的内容,你能给我解释一下吗?我对
Map
相当陌生,以前从未使用过它。@SiddAjmera我只能告诉你这个地图包含了什么。让我试试这个完美的让我试试这个