如何按类别汇总JavaScript对象数组的数量并生成唯一对象数组?
按类别汇总数量的正确实现方法
嘿,你的思路其实已经找对方向了!用reduce结合Map来做分类累加是非常高效的方式,只是代码里有个小拼写错误,还有可以再明确下细节,我帮你修正并解释清楚:
你的代码问题点
你在最后转换Map为对象数组时,把属性名写成了quantitya,这是笔误,应该改成quantity——这个小错误会导致最终结果里的数量属性名完全不对。
修正后的完整代码
var data = [ { cat: 'EK-1', name: "test", info: "mat", quantity: 1 }, { cat: 'EK-1', name: "test", info: "mat", quantity: 1 }, { cat: 'EK-1', name: "test", info: "mat", quantity: 1 }, { cat: 'EK-2', name: "test2", info: "nat", quantity: 1 } ]; const products = Array.from( data.reduce((acc, { cat, quantity }) => acc.set(cat, (acc.get(cat) || 0) + quantity), new Map() ), ([cat, quantity]) => ({ cat, quantity }) // 这里修正了quantitya的拼写错误 ); console.log(products); // 输出结果:[{ cat: 'EK-1', quantity: 3 }, { cat: 'EK-2', quantity: 1 }]
代码逻辑拆解
- 第一步:
data.reduce(...)遍历原数组,用Map存储每个cat对应的总数量。如果当前cat已经在Map里,就把现有数量加上当前项的quantity;如果不存在,就从0开始累加。 - 第二步:
Array.from(...)把Map的键值对转换成数组,再通过第二个参数的映射函数,把每个键值对转换成{ cat, quantity }格式的对象,最终得到你想要的唯一类别数组。
另一种实现方式(用普通对象累加)
如果你习惯用普通对象而不是Map,也可以这样写,逻辑完全一致:
var data = [ { cat: 'EK-1', name: "test", info: "mat", quantity: 1 }, { cat: 'EK-1', name: "test", info: "mat", quantity: 1 }, { cat: 'EK-1', name: "test", info: "mat", quantity: 1 }, { cat: 'EK-2', name: "test2", info: "nat", quantity: 1 } ]; const sumObj = data.reduce((acc, { cat, quantity }) => { acc[cat] = (acc[cat] || 0) + quantity; return acc; }, {}); const products = Object.entries(sumObj).map(([cat, quantity]) => ({ cat, quantity })); console.log(products); // 同样输出:[{ cat: 'EK-1', quantity: 3 }, { cat: 'EK-2', quantity: 1 }]
这两种方式都能完美实现你的需求,选你觉得更顺手的就行~
内容的提问来源于stack exchange,提问作者fderee dsds
相关产品推荐
相关产品推荐

