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

时间:2017-10-05 17:32:47

标签: 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 
}]

我玩了一下,到目前为止有类似的东西。它不起作用,但这是我正在寻找的逻辑类型。

arr1.forEach(item => 
  if (arr2.indexOf(item.transid) != -1){
    item.category = arr2.indexOf(item.transid).category
  }
)

3 个答案:

答案 0 :(得分:4)

GWT

arra1 = arra1.map(item => { let item2 = arra2.find(i2 => i2.transid === item.transid); return item2 ? { ...item, ...item2 } : item; }); 中的所有元素映射到arra1本身。在映射函数上尝试在arra1中找到相关项,并将两个项与对象扩展合并(如果没有),返回原始项。请注意,最后传播arra2对于合并至关重要,因此您使用item2中的值进行覆盖,但保留item2中未被覆盖的值。

答案 1 :(得分:2)

使用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);



let arr1 = [{
  "_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
}]

let arr2 = [{
  "_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
}]
// MOCK
function ObjectId(i) {
  return i;
}

function ISODate(i) {
  return i;
}
//
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);




答案 2 :(得分:1)

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

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

      if (itemFromArr2) {
         item1.category = itemFromArr2.category;
      }
   }
)