我有以下两个对象数组。我想更新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)
将所有元素映射arra1到arra1自身。在映射功能上,尝试在中找到相关项,arra2然后将两个与对象展开的项合并(如果未找到),否则返回原始项。请注意,item2最后的扩展对于合并至关重要,因此您可以覆盖from中的值,item2但不要覆盖其中的值item1。
您应该使用该方法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)
为此使用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)
| 归档时间: |
|
| 查看次数: |
3648 次 |
| 最近记录: |