首页 > 解决方案 > 如何根据javascript中的条件对现有数组对象中的值求和

问题描述

我有两个数组 listlist1list2, 属性name匹配,然后将qtylist1 和 list2 匹配对象的所有相加,返回 list1 的更新数量

function resultantArray(list1, list2){
  let sum = list2.map(o => o.qty|| 0).reduce((a, c) => { return a + c });
   list1.forEach(item=>{      
    list2.find(elm => elm.productcode == item.productcode).qty= sum;
   });
}

var list1 = [
  {id:1, name: "IN",qty: 1},
  {id:2, name: "TH"},
  {id:3, name: "AU"}
]
var list2 = [
  {id:3, name: "IN", qty:1},
  {id:5, name: "IN", qty:1},
  {id:4, name: "TH", qty: 2},
  {id:1, name: "SG", qty: 3}
]

预期输出:

 [
  {id:1, name: "IN",qty: 3},
  {id:2, name: "TH", qty: 2},
  {id:3, name: "AU"}
]

标签: javascriptarraysobjectjavascript-objects

解决方案


您可以创建一个 Map 来创建结果列表,但按名称键入。然后迭代第二个列表并相应地更新地图中的对象。最后将值提取到结果列表中。

Map 的使用避免了您使用findorfilter或其他一些嵌套循环,并使算法在线性时间内运行。

var list1 = [{id:1, name: "IN", qty: 1},{id:2, name: "TH"},{id:3, name: "AU"}]
var list2 = [{id:3, name: "IN", qty:1},{id:5, name: "IN", qty:1},{id:4, name: "TH", qty: 2},{id:1, name: "SG", qty: 3}];

const map = new Map(list1.map(o => [o.name, {...o}]));
for (let o of list2) {
    let p = map.get(o.name);
    if (p && o.qty) p.qty = (p.qty || 0) + o.qty;
}
const result = Array.from(map.values());

console.log(result);


推荐阅读