用 reduce 按唯一字段(如 productId)归类累加生成 key-value 对象,再用 Object.values 提取去重后的分组汇总结果;支持复合 key、多种聚合方式,注意 key 必须为唯一字符串。

用 reduce 配合 Object.values 去重并汇总分组数据,核心思路是:先用 reduce 按某个字段(如 id、name)归类并累加,生成一个以该字段为 key 的对象;再用 Object.values 提取所有分组后的结果数组,天然去重(因为对象 key 不重复)。
按唯一标识字段分组并汇总数值
比如有一组订单数据,要按 productId 合并,统计总数量和总金额:
const orders = [
{ productId: 'A', qty: 2, price: 10 },
{ productId: 'B', qty: 1, price: 25 },
{ productId: 'A', qty: 3, price: 10 },
{ productId: 'C', qty: 5, price: 8 }
];
<p>const grouped = Object.values(
orders.reduce((acc, item) => {
const { productId, qty, price } = item;
if (!acc[productId]) {
acc[productId] = { productId, totalQty: 0, totalAmount: 0 };
}
acc[productId].totalQty += qty;
acc[productId].totalAmount += qty * price;
return acc;
}, {})
);</p><p>// 结果:
// [
// { productId: 'A', totalQty: 5, totalAmount: 50 },
// { productId: 'B', totalQty: 1, totalAmount: 25 },
// { productId: 'C', totalQty: 5, totalAmount: 40 }
// ]
处理嵌套结构或需要自定义去重逻辑
如果“去重”依据不是单个字段,而是多个字段组合(如 name + category),可拼接成复合 key:
Java Maven 项目审查工作流的通用输入处理。当 Java Maven 项目以 ZIP压缩包或 GitLab 仓库 URL 形式提供且需要...时使用。
- 用
`${item.name}-${item.category}`作为对象的 key - 在 reduce 中检查该复合 key 是否存在,不存在则初始化
- 汇总后仍用
Object.values()得到去重+聚合结果
注意点:key 必须是字符串,且保证唯一性
对象 key 会自动转为字符串,所以避免用对象、数组直接当 key(会变成 [object Object]):
立即学习“Java免费学习笔记(深入)”;
- ✅ 正确:
acc[item.id]、acc[`${item.a}-${item.b}`] - ❌ 错误:
acc[item]、acc[item.tags](若 tags 是数组) - 若原始数据中 key 可能为
null或undefined,建议先做默认值处理,例如item.id ?? 'unknown'
扩展:支持多种汇总方式(求和/计数/取最新/合并数组)
reduce 内部逻辑可灵活定制:
- 计数:用
count: (acc[key]?.count || 0) + 1 - 取最新项:用
acc[key] = item(后面覆盖前面) - 合并数组:用
acc[key].items = [...(acc[key]?.items || []), item.data]

















