如何基于两个数组对象的对象项ID获取新数组?

时间:2019-02-04 19:50:52

标签: javascript arrays

我有两个对象数组,如下所示:

 otherId: {
    type: Sequelize.TEXT,
    allowNull: false,
    defaultValue: Sequelize.col('_id')
  }

新数组必须包括a2项
-如果a2和a1的项具有相同的ID (1,2,3,...)
-else,a1的项目

数组的顺序应与商品ID的顺序一致。

预期结果:

a1 = [
{id:1, name:"parent 1"},
{id:3, name:"parent 3"},
{id:4, name:"parent 4"},
{id:5, name:"parent 5"},
{id:6, name:"parent 6"}
];
a2 = [
{id:1, name:"parent 1"},
{id:2, name:"parent 2"},
{id:5, name:"parent 5"}
];

3 个答案:

答案 0 :(得分:2)

如果我理解正确,那么您需要a1的更新版本,其中的新元素来自a2。一种解决方法是将a2a1尚未在ids数组中的所有a2元素串联起来,为此我们使用filter()a1上。然后,您可以使用sort()获得最终结果。

a1 = [
  {id:1, name:"parent 1"},
  {id:3, name:"parent 3"},
  {id:4, name:"parent 4"},
  {id:5, name:"parent 5"},
  {id:6, name:"parent 6"}
];

a2 = [
  {id:1, name:"parent 1 Updated"},
  {id:2, name:"parent 2 New"},
  {id:5, name:"parent 5 Updated"}
];

let res = a2.concat(
    a1.filter(x => !a2.find(y => y.id === x.id))
)
.sort((a, b) => a.id - b.id);

console.log(res);

答案 1 :(得分:0)

尝试根据每个数组的大小进行for循环

for (i = 0; i < a1.length; i++) { 
  if(a1[i] != null && a2[i] != null && a1[i][id]==a2[i][id])
     {
          a3.push(a1[i]);
    }
}

答案 2 :(得分:0)

您可以使用reduceObject.values

做类似的事情

const a1=[{id:1,name:"parent 1"},{id:3,name:"parent 3"},{id:4,name:"parent 4"},{id:5,name:"parent 5"},{id:6,name:"parent 6"}],
      a2=[{id:1,name:"parent 1"},{id:2,name:"parent 2"},{id:5,name:"parent 5"}];

const a1map = a1.reduce((r,a) => (r[a.id] = a, r), {}),
      a2map = a2.reduce((r,a) => (r[a.id] = a, r), {}),
      merged = {...a1map, ...a2map};
      
const output = Object.values(merged)

console.log(output)

使用id作为键创建一个累加器,并将数组中的每个对象作为其值。然后合并它们。如果ida1map中都存在a2map,则a2的值将替换a1的值。