最简洁可靠的方式是用 set 配合扩展运算符:[...new set([...arr1, ...arr2])],天然去重、不修改原数组、语义清晰、兼容es6+;对象数组需按字段(如id)手动去重。

JavaScript 中合并两个数组并自动去重,最简洁可靠的方式是用 Set 配合扩展运算符(...),它天然去重且不修改原数组。
用 Set + 扩展运算符一次性合并去重
这是目前最推荐的方法,代码简短、语义清晰、兼容性好(ES6+):
- 先用扩展运算符把两个数组展开成参数列表
- 传入
new Set()自动去除重复项 - 再用扩展运算符转回数组
示例:
const arr2 = [3, 4, 5];
const mergedUnique = [...new Set([...arr1, ...arr2])];
// 结果:[1, 2, 3, 4, 5]
如果需要保持原始顺序且兼容老环境(如 IE)
Set 在旧浏览器中不支持,可用 filter() + indexOf() 模拟去重,但注意需先合并再过滤:
- 用
concat()合并数组(避免修改原数组) - 用
filter()保留首次出现的元素
示例:
const merged = arr1.concat(arr2);const mergedUnique = merged.filter((item, index) => merged.indexOf(item) === index);
处理对象数组时不能直接用 Set
Set 对对象按引用去重,相同结构的对象仍被视为不同项。此时需手动定义“重复逻辑”:
- 提取唯一标识字段(如
id),用Map或对象记录已见 key - 或用
filter()配合some()判断是否已存在
示例(按 id 去重):
const arr2 = [{id: 2, name: 'b2'}, {id: 3, name: 'c'}];
const all = [...arr1, ...arr2];
const seen = new Set();
const mergedUnique = all.filter(item => {
if (seen.has(item.id)) return false;
seen.add(item.id);
return true;
});
注意:原地去重或性能敏感场景可选 reduce
若想一步到位、减少中间数组创建,可用 reduce 累积结果:
return acc.includes(cur) ? acc : [...acc, cur];
}, []);
但注意 includes() 在大数组中效率较低;如数据量大,建议改用 Set 辅助判断。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











