并集可一行实现:const union = [...new set([...a, ...b])];先展开合并数组,再用set去重并转回数组,支持原始类型且保持顺序,但对象需自定义去重逻辑。

用 Set 和展开运算符(...)实现数组并集,只需一行代码,干净、高效、无重复。
核心写法:一行搞定并集
假设你有两个数组 a 和 b,想得到它们的并集(所有不重复的元素):
const union = [...new Set([...a, ...b])];
原理很直接:先用展开运算符把两个数组“铺平”成一个长数组,再用 Set 自动去重,最后再展开回数组。
为什么比传统方法更简洁?
- 不用写循环或
filter+includes判断是否已存在 - 无需手动维护临时集合或哈希表
- 不依赖第三方库(如 Lodash 的
union) - 天然支持任意原始类型(
string、number、boolean、null、undefined),但注意NaN在Set中会被正确视为唯一值(而===不成立)
实际使用小贴士
- 如果输入可能含非原始值(如对象、数组),
Set无法按“内容相等”去重,此时需自定义逻辑 - 顺序保持:并集结果顺序是
a元素在前、b中新元素在后(因为Set按插入顺序迭代) - 可封装为复用函数:
const union = (a, b) => [...new Set([...a, ...b])]; - 支持多个数组扩展:
[...new Set([...a, ...b, ...c, ...d])]
对比:原始值 vs 引用值
Set 对原始值严格按值比较,例如:
const a = [1, '2', true]; const b = ['2', 3, false]; console.log(union(a, b)); // [1, "2", true, 3, false]
但对对象,每个都是独立引用:
const a = [{x: 1}, {x: 2}];
const b = [{x: 1}, {y: 3}];
console.log([...new Set([...a, ...b])]); // 仍是 4 个对象 —— 因为引用不同
这种情况下,需要先序列化或提取唯一键(如 id)来处理。










