You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何按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} ]

步骤解释:

  1. _.groupBy(originalResult, 'itemNumber'):把原数组按itemNumber分组,得到一个键为item编号、值为对应元素数组的对象,比如{ '1288': [ {...}, {...} ], '3298': [ {...} ] }
  2. _.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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.11 07:46:40