Javascript根据匹配索引的另一个数组更新一个数组

mo_*_*aat 4 javascript arrays

我有以下两个对象数组。我想更新array1元素以反映与transid匹配的array2元素。因此,我的结果应该是一个新数组,其中array1中的两个元素已更新以反映array2中的值,或者是具有更新后值的相同array1。

用一些更现代的语法实现此目的的最佳方法是什么?我打开了几个选项,以便可以进行比较。例如,我猜测可以将array1中的匹配对象替换为array2对象,或者可以通过对元素进行某种迭代来更新array1对象中的各个元素。

var arra1 = [{
    "_id" : ObjectId("583f6e6d14c8042dd7c979e6"),
    "transid" : 1,
    "acct" : "acct1",
    "transdate" : ISODate("2012-01-31T05:00:00.000Z"),
    "category" : "category1",
    "amount" : 103 
}, {
    "_id" : ObjectId("583f6e6d14c8042dd7c2132t6"),
    "transid" : 2,
    "acct" : "acct2",
    "transdate" : ISODate("2012-01-31T05:00:00.000Z"),
    "category" : "category2",
    "amount" : 103 
}]

var arra2 = [{
    "_id" : ObjectId("583f6e6d14c8042dd7c979e6"),
    "transid" : 1,
    "acct" : "acct2",
    "transdate" : ISODate("2012-01-31T05:00:00.000Z"),
    "category" : "category5",
    "amount" : 107 
}, {
    "_id" : ObjectId("583f6e6d14c8042dd7c2132t6"),
    "transid" : 2,
    "acct" : "acct2",
    "transdate" : ISODate("2012-01-31T05:00:00.000Z"),
    "category" : "category2",
    "amount" : 103 
}, {
    "_id" : ObjectId("583f6e6d14c8042dd7c2132t6"),
    "transid" : 3,
    "acct" : "acct2",
    "transdate" : ISODate("2016-07-31T05:00:00.000Z"),
    "category" : "category3",
    "amount" : 103 
}]
Run Code Online (Sandbox Code Playgroud)

到目前为止,我玩了一点,并且有类似的东西。它不起作用,但这就是我要寻找的逻辑类型。

arr1.forEach(item => 
  if (arr2.indexOf(item.transid) != -1){
    item.category = arr2.indexOf(item.transid).category
  }
)
Run Code Online (Sandbox Code Playgroud)

Mar*_*olo 10

arra1 = arra1.map(item => {
  let item2 = arra2.find(i2 => i2.transid === item.transid);
  return item2 ? { ...item, ...item2 } : item;
});
Run Code Online (Sandbox Code Playgroud)

将所有元素映射arra1arra1自身。在映射功能上,尝试在中找到相关项,arra2然后将两个与对象展开的项合并(如果未找到),否则返回原始项。请注意,item2最后的扩展对于合并至关重要,因此您可以覆盖from中的值,item2但不要覆盖其中的值item1

  • 我爱你,伙计 (2认同)

Oli*_*ssé 6

您应该使用该方法find来检索匹配的项目

arr1.forEach(item1 => {
      var itemFromArr2 = arr2.find(item2 => item2.transid == item1.transid);

      if (itemFromArr2) {
         item1.category = itemFromArr2.category;
      }
   }
)
Run Code Online (Sandbox Code Playgroud)


chr*_*con 5

为此使用reduce

let res = arr2.reduce((a,b) => {
    let a1 = arr1.find(e => e.transid === b.transid) || {};
    return a.concat(Object.assign(a1, b));
},[]);

console.log(res);
Run Code Online (Sandbox Code Playgroud)

let res = arr2.reduce((a,b) => {
    let a1 = arr1.find(e => e.transid === b.transid) || {};
    return a.concat(Object.assign(a1, b));
},[]);

console.log(res);
Run Code Online (Sandbox Code Playgroud)