按order_id合并对象并累加price,500+数据场景reduce是否适用?
合并对象数组并累加字段:reduce是最优解吗?
嘿,这个场景特别适合用reduce方法来搞定,而且它绝对是这类数组聚合需求里最简洁高效的方案之一!
为什么reduce适合?
reduce方法的核心就是对数组进行遍历,并将元素逐步聚合为一个最终结果——刚好完美匹配你“按order_id分组、累加对应price”的需求,不用额外维护外部变量,逻辑闭环性很强。
具体实现代码
直接用reduce构建一个以order_id为键的中间对象,最后转成数组即可:
const sales = [ { order_id: 138, price: 25 }, { order_id: 138, price: 30 }, { order_id: 139, price: 15 }, { order_id: 131, price: 25 }, ]; const mergedSales = Object.values( sales.reduce((acc, currentItem) => { // 检查当前order_id是否已存在于累加器中 if (acc[currentItem.order_id]) { acc[currentItem.order_id].price += currentItem.price; } else { // 不存在则新建条目,避免修改原数组对象 acc[currentItem.order_id] = { ...currentItem }; } return acc; }, {}) // 初始值设为空对象,用来存储分组后的结果 ); console.log(mergedSales); // 输出结果完全符合你的需求: // [ // { order_id: 138, price: 55 }, // { order_id: 139, price: 15 }, // { order_id: 131, price: 25 } // ]
其他可选实现方式
当然你也可以用forEach来实现,但代码会稍显繁琐,需要手动维护外部的累加对象:
const acc = {}; sales.forEach(item => { if (acc[item.order_id]) { acc[item.order_id].price += item.price; } else { acc[item.order_id] = { ...item }; } }); const mergedSales = Object.values(acc);
总结
处理500+条数据的话,reduce和forEach在性能上几乎没有差别,但reduce的代码更紧凑、逻辑更内聚,是这个场景下的首选方案。
内容的提问来源于stack exchange,提问作者Malibur
相关产品推荐
相关产品推荐

