交集返回两数组共有元素且去重保序:const intersection = (a, b) => Array.from(new Set(a.filter(x => new Set(b).has(x))));差集返回a有b无的元素;并集用Set自动去重合并;对称差为仅在一方出现的元素。

直接用 Set 和 Array.from 搭配,就能快速写出轻量、无依赖的集合运算工具函数——不需要引入 Lodash 或重写底层,核心逻辑清晰,结果自动去重且保持原始顺序(插入顺序)。
交集:取两个数组共有的元素
原理是把一个数组转为 Set 做查找优化,再用 filter 筛出另一个数组中也存在的项,最后用 Array.from 转回数组(可选,但统一返回类型)。
const intersection = (a, b) => {
const setB = new Set(b);
return Array.from(new Set(a.filter(x => setB.has(x))));
};- 内层
new Set(...)保证结果无重复 - 外层
Array.from把 Set 转成数组,便于链式调用或后续操作 - 例如:
intersection([1,2,2,3], [2,3,4]) → [2,3]
差集(a - b):取 a 中有、b 中没有的元素
同样利用 Set 提升查找效率,过滤时只保留不在 setB 中的元素。
const difference = (a, b) => {
const setB = new Set(b);
return Array.from(new Set(a.filter(x => !setB.has(x))));
};- 注意:这是单向差集(a 相对于 b),不等价于对称差
- 保留 a 的首次出现顺序,重复元素在结果中仅出现一次
- 例如:
difference([1,2,3,4], [2,3]) → [1,4]
并集:合并两数组并去重
最简方式是把两个数组展开进 Set 构造器,再转回数组。
const union = (a, b) => Array.from(new Set([...a, ...b]));
- 利用展开运算符拼接,
Set自动去重 - 结果顺序 = a 的顺序 + b 中不在 a 的新元素顺序(符合 Set 插入顺序规则)
- 例如:
union([1,2], [2,3]) → [1,2,3]
对称差:只在其中一个数组里出现的元素
即「并集减去交集」,也可用两次差集合并实现,更直观:
const symmetricDifference = (a, b) => {
const setA = new Set(a);
const setB = new Set(b);
return Array.from([
...a.filter(x => !setB.has(x)),
...b.filter(x => !setA.has(x))
]).filter((x, i, arr) => arr.indexOf(x) === i); // 二次去重(避免 a/b 各自内部重复导致结果重复)
};- 更推荐写法:用
new Set包裹整个拼接结果,一步去重 Array.from(new Set([...a.filter(x => !setB.has(x)), ...b.filter(x => !setA.has(x))]))- 例如:
symmetricDifference([1,2,3], [2,3,4]) → [1,4]
这些函数都默认接受任意可迭代数组(包括类数组、字符串等),扩展性好;若需支持对象比较,得额外传入比较函数,此时就不能直接依赖 Set 的引用相等逻辑了。不复杂但容易忽略细节。











