我有以下两个对象数组。我想更新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
}
)
答案 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;
}
}
)