用 reduce 合并多个数组并去重有三种方式:1. reduce + includes 保持顺序但效率低;2. reduce + Set 高效推荐,适合中大型数组;3. reduce + Map 处理对象数组,按唯一键(如 id)去重。

用 reduce 合并多个数组并去重,核心是把所有数组“摊开”再逐个收集进一个新数组(或 Set),同时跳过已存在的项。
用 reduce + includes 做基础去重合并
适合小数据量、要求保持原始顺序、不依赖 Set 的场景。思路是:初始值设为空数组,每轮把当前数组的每个元素检查是否已在结果数组中,没出现过才 push 进去。
const arr1 = [1, 2, 3];
const arr2 = [3, 4, 5];
const arr3 = [5, 6, 1];
const merged = [arr1, arr2, arr3].reduce((acc, currArr) => {
currArr.forEach(item => {
if (!acc.includes(item)) {
acc.push(item);
}
});
return acc;
}, []);
console.log(merged); // [1, 2, 3, 4, 5, 6]
用 reduce + Set 提升效率(推荐)
对中大型数组更高效,避免每次调用 includes 的 O(n) 查找。先用 Set 收集所有唯一值,最后转回数组;reduce 只负责“扁平化 + 累加”。
- 先用
flat()展开多维数组(如果嵌套),或直接遍历各子数组 - 在
reduce中不断向一个Set添加元素 - 最后用
[...set]或Array.from(set)转成数组
const arr1 = [1, 2, 3];
const arr2 = [3, 4, 5];
const arr3 = [5, 6, 1];
const uniqueMerged = [arr1, arr2, arr3]
.reduce((set, arr) => {
arr.forEach(item => set.add(item));
return set;
}, new Set())
.values();
console.log([...uniqueMerged]); // [1, 2, 3, 4, 5, 6]
处理对象数组的去重合并
如果数组里是对象,不能直接用 Set 或 includes 比较(引用不同即视为不同)。需指定唯一标识字段(如 id),用 Map 或对象记录已存在 key。
Java项目代码review工具。分析Git变更+完整调用链路上下文,推断业务需求,进行多维度评分和分类汇总,生成完整PRD文档。包含细粒度Java代码审查清单(Null安全、异常处理、Streams、并发、equals/hashCode、资源管理、API设计、性能、MyBatis/ORM、事务边界、SQL/DD...
立即学习“Java免费学习笔记(深入)”;
- 用
Map存储id → item映射,避免重复添加相同 id 的对象 -
reduce遍历每个子数组,只在 Map 中无该 id 时插入 - 最后用
Map.values()获取去重后的对象数组
const users1 = [{ id: 1, name: 'Alice' }, { id: 2, name: 'Bob' }];
const users2 = [{ id: 2, name: 'Bob' }, { id: 3, name: 'Charlie' }];
const uniqueUsers = [users1, users2].reduce((map, arr) => {
arr.forEach(user => {
if (!map.has(user.id)) {
map.set(user.id, user);
}
});
return map;
}, new Map());
console.log(Array.from(uniqueUsers.values()));
// [{ id: 1, name: 'Alice' }, { id: 2, name: 'Bob' }, { id: 3, name: 'Charlie' }]
一行写法(简洁但可读性略低)
适合简单场景,利用扩展运算符和 Set 一步到位:
const result = [...new Set([arr1, arr2, arr3].flat())];
注意:flat() 默认只展一层,若数组嵌套更深需传参如 .flat(2);此写法未用 reduce,但语义上更直接——如果你必须用 reduce,就选上面任一方案。

















