如何在Node.js中合并数组重复项并汇总数量生成新数组?
解决Node.js中发票产品数组重复项合并、汇总quantity的问题
你可以使用Array.reduce()方法高效实现重复产品的合并与quantity汇总,这比forEach更适配这类聚合场景。以下是具体实现:
代码示例
const products = [ { quantity: 1, description: 'Node Training Package', 'tax-rate': -40.5, price: 20 }, { quantity: 1, description: 'Node Training Package', 'tax-rate': -40.5, price: 20 }, { quantity: 1, description: 'Angular crash course', 'tax-rate': -40.5, price: 35 }, { quantity: 1, description: 'Node Training Package', 'tax-rate': -40.5, price: 20 }, { quantity: 1, description: 'Angular crash course', 'tax-rate': -40.5, price: 35 }, { quantity: 1, description: 'PHP Training', 'tax-rate': -40.5, price: 35 } ]; const mergedProducts = Object.values( products.reduce((acc, product) => { // 以description作为分组标识,若需更严格匹配,可拼接price、tax-rate等字段生成key const key = product.description; if (acc[key]) { // 已存在则累加quantity acc[key].quantity += product.quantity; } else { // 不存在则添加新条目,浅拷贝避免修改原数组引用 acc[key] = { ...product }; } return acc; }, {}) ); console.log(mergedProducts);
代码说明
- reduce聚合逻辑:通过reduce遍历原数组,以空对象作为初始累加器,集中处理分组与数量累加。
- 分组规则:用产品
description作为分组key,若需区分同名但价格/税率不同的产品,可改用${product.description}-${product.price}-${product['tax-rate']}作为唯一key。 - 数量累加与条目创建:累加器中已有对应产品则直接加quantity,无对应产品则浅拷贝当前产品对象存入累加器。
- 转换为目标数组:用
Object.values()提取累加器中的产品条目,得到最终合并后的数组。
为什么forEach易出错?
用forEach实现时,需手动维护分组对象,还要注意避免原数组对象引用被意外修改,稍不注意就会出现累加错误或数据污染,reduce则将聚合逻辑封装得更简洁可靠。
内容的提问来源于stack exchange,提问作者GKC
相关产品推荐
相关产品推荐

