javascript - 如何根据javascript中的条件对现有数组对象中的值求和
问题描述
我有两个数组 listlist1
和list2
, 属性name
匹配,然后将qty
list1 和 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"}
]
解决方案
您可以创建一个 Map 来创建结果列表,但按名称键入。然后迭代第二个列表并相应地更新地图中的对象。最后将值提取到结果列表中。
Map 的使用避免了您使用find
orfilter
或其他一些嵌套循环,并使算法在线性时间内运行。
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);
推荐阅读
- makefile - `make` 何时应用隐式规则 `Makefile: Makefile.o`?
- java - Ljavax/validation/constraints/Pattern$Flag 属于哪个Jar?
- node.js - 带有 AWS 服务的 Bloomfilter
- java - Java - 要设置的 Json 字符串
- python-3.x - 正则表达式前瞻排除 Python 中的下划线
- php - 如何检查PHP中的数组元素中是否存在两个变量
- msp430 - MSP-EXP430G2ET 无法将代码传递给微控制器
- sqlalchemy - 多边形包含点 - 使用 GeoAlchemy
- vb.net - visual basic:输入一些数字,直到输入负值以停止程序
- c++ - 如何修复我的快速排序实现?