如何按key合并数组相似对象并累加quantity?求Lodash实现方案
解决数组对象按itemNumber合并并累加quantity的Lodash方案
嘿,我来帮你搞定这个问题!首先得说一句:你之前用原生reduce写的逻辑有个关键bug——当找到相同itemNumber的元素时,你直接返回了累加器sum,但完全没对quantity进行累加操作,所以相同项的数量根本没加起来,这就是没得到预期结果的原因。
接下来给你两种用Lodash实现的简洁方案,都能完美达到你的需求:
方案一:用_.groupBy + _.map + _.sumBy组合(最直观)
这个思路先按itemNumber分组,再对每组的quantity求和,最后整理成目标格式:
const _ = require('lodash'); // 确保已引入Lodash const originalResult = [ {itemNumber:'1288',quantity:700}, {itemNumber:'3298',quantity:1000}, {itemNumber:'1288',quantity:300} ]; const mergedResult = _.map(_.groupBy(originalResult, 'itemNumber'), (items, itemNum) => ({ itemNumber: itemNum, quantity: _.sumBy(items, 'quantity') })); console.log(mergedResult); // 输出:[ {itemNumber:'1288',quantity:1000}, {itemNumber:'3298',quantity:1000} ]
步骤解释:
_.groupBy(originalResult, 'itemNumber'):把原数组按itemNumber分组,得到一个键为item编号、值为对应元素数组的对象,比如{ '1288': [ {...}, {...} ], '3298': [ {...} ] }_.map(...):遍历这个分组对象,对每个组做两件事:- 用
itemNum作为新对象的itemNumber - 用
_.sumBy(items, 'quantity')累加该组所有元素的quantity
- 用
方案二:用_.reduce + _.find(和你原来的思路更接近)
如果你更习惯用reduce的思路,Lodash的_.reduce结合_.find可以修正你原来的逻辑:
const _ = require('lodash'); const originalResult = [ {itemNumber:'1288',quantity:700}, {itemNumber:'3298',quantity:1000}, {itemNumber:'1288',quantity:300} ]; const mergedResult = _.reduce(originalResult, (acc, curr) => { // 在累加器中查找已有相同itemNumber的元素 const existingItem = _.find(acc, { itemNumber: curr.itemNumber }); if (existingItem) { // 找到就累加quantity existingItem.quantity += curr.quantity; } else { // 没找到就把当前元素加入累加器(浅拷贝避免修改原数组元素,可选) acc.push({...curr}); } return acc; }, []); console.log(mergedResult); // 输出和方案一一致
这个方案和你原来的原生reduce逻辑类似,但补上了累加quantity的关键步骤,同时用_.find简化了查找相同元素的代码,比原生的for循环更简洁。
内容的提问来源于stack exchange,提问作者Bar Levin
相关产品推荐
相关产品推荐

