用 reduce 配合 map 可高效去重并累加重复项数值,核心是以唯一键为索引动态更新 map 中对应值:存在则累加,不存在则初始化,最终返回 map 实例并可转为数组。

用 reduce 配合 Map 去重并累加重复项的数值,核心是把 Map 当作累积器(accumulator),以某个唯一键为索引,动态更新对应值。关键在于:每次遍历时,检查该键是否存在,存在就累加,不存在就初始化。
用 Map 作为 reduce 的初始值
reduce 的第二个参数传入一个空 Map 实例,后续每轮返回它自身,实现“就地更新”。避免频繁创建新对象,也天然支持键值对的高效查找与修改。
- 初始化:
arr.reduce((map, item) => { ... }, new Map()) - 假设数据是对象数组,且按
id去重、按count累加;也可适配字符串、数字等简单类型
提取键并判断是否已存在
在回调中先提取用于去重的键(如 item.id),再用 map.has(key) 判断是否首次出现。这是动态累加的前提逻辑。
- 存在:用
map.get(key)拿出当前值,加上新项的数值(如item.count) - 不存在:直接设为新项的数值(或构造新对象)
- 统一用
map.set(key, newValue)更新,返回map
完整示例:合并商品列表(按 id 合并,累加数量)
输入:
const items = [
{ id: 'a', name: '苹果', count: 2 },
{ id: 'b', name: '香蕉', count: 1 },
{ id: 'a', name: '苹果', count: 3 },
{ id: 'c', name: '橙子', count: 4 }
];
处理:
const merged = items.reduce((map, item) => {
const key = item.id;
if (map.has(key)) {
const existing = map.get(key);
map.set(key, { ...existing, count: existing.count + item.count });
} else {
map.set(key, { ...item });
}
return map;
}, new Map());
// 转成数组(可选)
const result = Array.from(merged.values());
输出:[{id:'a',name:'苹果',count:5}, {id:'b',name:'香蕉',count:1}, {id:'c',name:'橙子',count:4}]
小技巧:一行写法(适合简单结构)
如果只累加数值、不保留其他字段,可用更紧凑写法:
const counts = items.reduce( (map, item) => map.set(item.id, (map.get(item.id) || 0) + item.count), new Map() );
这样得到的是 Map<string number></string>,调用 counts.get('a') 即得总数。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











