可用set去重+filter求交集,解构赋值仅用于提取结果;基础写法为const intersection = (a, b) => [...new set(a)].filter(x => new set(b).has(x)),性能接近o(n+m),保留a中顺序且去重。

可以用 Set 去重 + 数组 filter + 解构赋值,一行写出交集,但“解构赋值”本身不直接参与求交集,它常用于提取结果(比如取第一个交集元素),真正核心是一行表达式组合。
基础写法:用 Set 加 filter 实现交集
这是最常用、可读性好且性能不错的一行写法:
const intersection = (a, b) => [...new Set(a)].filter(x => new Set(b).has(x));
说明:
-
new Set(a)去除数组a的重复项;[...new Set(a)]转回数组(保证唯一) -
new Set(b)构建b的哈希集合,使.has(x)查找为 O(1),整体复杂度接近 O(n+m) - 注意:该写法默认保留
a中首次出现的顺序,且不重复包含相同值
若真要“配合解构赋值”,常见于提取交集中的特定值
比如你只关心“第一个共同元素”,就可以结合解构快速获取:
const [firstCommon] = [...new Set(arr1)].filter(x => new Set(arr2).has(x));
这行代码做了三件事:构造去重的 arr1、筛选出在 arr2 中也存在的元素、用解构取第一个。如果无交集,firstCommon 为 undefined。
其他类似用法:
-
const [head, ...rest] = intersection(arr1, arr2);—— 拆分首个与其余 -
const [, second] = intersection(arr1, arr2);—— 直接跳过第一个,取第二个
进阶优化:复用 Set 避免重复创建(更高效的一行)
上面写法每次 filter 都新建一个 Set(b),其实可以提前建一次:
const intersection = (a, b) => { const s = new Set(b); return [...new Set(a)].filter(x => s.has(x)); };
虽然严格说超了一行,但封装成函数后调用仍简洁。若坚持单表达式,可用立即执行函数:
const intersection = (a, b) => ((s) => [...new Set(a)].filter(x => s.has(x)))(new Set(b));
注意事项
这种写法默认比较的是值相等(===),对对象或嵌套结构无效。如需深度交集,需额外序列化或自定义逻辑,无法靠 Set 简单解决。
另外,空数组、null、undefined 输入需自行防御,原生 Set 不会报错但可能返回意外结果。










