JavaScript的Set无内置交集方法,但可通过将所有数组转为Set后筛选首个Set中存在于所有Set的元素来高效实现交集,结果自动去重且保持首数组顺序。

JavaScript 的 Set 本身不提供直接的交集方法,但可以借助其去重和高效查找(has)特性,结合数组的 filter 和 every,原生实现多个数组的交集,无需外部库。
核心思路:把第一个数组转为 Set,再逐个检查其他数组是否都包含该元素
交集是指同时存在于所有输入数组中的元素。利用 Set.prototype.has() 的平均 O(1) 查找性能,能显著提升效率,尤其在大数组场景下优于多次 Array.includes()。
- 将第一个数组转为
Set(作为基准集合) - 用
Array.from()或扩展运算符将其转回数组,再用filter筛选 - 对每个候选元素,用
every()检查它是否存在于其余所有数组中(建议也提前转成Set提升查找速度)
推荐写法:统一转为 Set 后再计算交集
更健壮的做法是——把**所有数组都转为 Set**,然后取第一个 Set 的值,逐个判断是否在其余每个 Set 中都存在。这样避免了重复调用 includes 带来的性能损耗。
示例代码:
在调试 Java 后端 API 故障时使用此技能,尤其适用于以下任务:分析日志、跨 Controller、Service 和 Mapper 层追踪请求、定位异常根因、检查 SQL 执行或参数流转,以及生成简洁的诊断结论与修复方案。
立即学习“Java免费学习笔记(深入)”;
function intersection(...arrays) {
if (arrays.length === 0) return [];
if (arrays.length === 1) return [...new Set(arrays[0])];
// 全部转为 Set,便于 O(1) 查找
const sets = arrays.map(arr => new Set(arr));
// 取第一个 Set 的所有值,过滤出在所有 Set 中都存在的元素
return Array.from(sets[0]).filter(item =>
sets.every(set => set.has(item))
);
}
// 使用示例
const a = [1, 2, 3, 4];
const b = [2, 3, 5, 6];
const c = [3, 4, 6, 7];
console.log(intersection(a, b, c)); // [3]
注意点:交集结果自动去重且保持首个数组中首次出现顺序
Set 天然去重,所以结果不含重复项;而 Array.from(set) 遍历顺序与元素首次加入 Set 的顺序一致,因此最终交集数组的顺序由第一个数组决定(不是按数值大小或最后出现位置)。
- 如果输入数组含重复值(如
[1, 1, 2]),交集结果中1只会出现一次 - 若需保留原始重复逻辑(非常规需求),应改用 Map 计数或手动遍历,而非纯 Set 交集
- 空数组参与时,交集结果为
[](因为没有任何元素能“同时存在于空数组中”)
扩展:链式交集(两两求交,适合流式处理)
若数组数量极大,或需中间调试,可封装为两两交集函数,再用 reduce 连续计算:
const intersectTwo = (a, b) => {
const setA = new Set(a);
return [...new Set(b)].filter(x => setA.has(x));
};
const intersectionReduce = (...arrays) =>
arrays.reduce((acc, curr) => intersectTwo(acc, curr), arrays[0] ?? []);
console.log(intersectionReduce([1,2,3], [2,3,4], [3,4,5])); // [3]
这种方式更易理解、便于单步验证,但底层仍是基于 Set 的高效查找。

















