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

如何按类别汇总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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.30 18:47:51