javascript找数组交集最常用方法是filter+includes(适合小数组)或filter+set(推荐,性能好且天然去重);对象数组需按字段(如id)提取set后匹配。

用 JavaScript 找两个数组的交集,最常用且清晰的方式是结合 filter 和 includes,或者用 Set 提升性能。下面介绍几种实用方法,按场景选择即可。
基础方法:filter + includes(适合小数组、代码简洁)
对第一个数组逐项判断是否在第二个数组中存在,返回共同元素:
const arr1 = [1, 2, 3, 4]; const arr2 = [3, 4, 5, 6]; const intersection = arr1.filter(item => arr2.includes(item)); // 结果:[3, 4]
注意:该方法保留重复元素(如 arr1 = [3, 3, 4] 会返回 [3, 3, 4]),若需去重,后面再处理。
去重交集:filter + Set(推荐日常使用)
先将第二个数组转为 Set,提升查找效率(O(1)),再配合 filter 并自动去重(利用 Set 构造时的唯一性):
const arr1 = [1, 2, 2, 3, 4]; const arr2 = [2, 3, 3, 5, 6]; const set2 = new Set(arr2); const intersection = [...new Set(arr1)].filter(item => set2.has(item)); // 结果:[2, 3]
- 优点:逻辑清晰、性能好、天然去重
-
注意:如果原数组含对象或复杂类型,
Set和includes都无法按值比较,需另写比较逻辑
处理对象数组的交集(按某个字段匹配)
比如两个用户数组,想找出 ID 相同的用户:
const users1 = [{id: 1, name: 'Alice'}, {id: 2, name: 'Bob'}];
const users2 = [{id: 2, name: 'Bobby'}, {id: 3, name: 'Charlie'}];
const ids2 = new Set(users2.map(u => u.id));
const intersection = users1.filter(u => ids2.has(u.id));
// 结果:[{id: 2, name: 'Bob'}]
也可封装成通用函数,传入 key 名(如 'id')来灵活匹配。
一行写法(ES6+,适合简单场景)
如果追求极简,且不关心重复和类型,可这样写:
const intersection = [...new Set(arr1)].filter(i => new Set(arr2).has(i));
但注意:每次 filter 都新建 Set,性能略差,仅建议用于一次性小数据。
不复杂但容易忽略的是数据类型和重复处理——明确需求后再选方法,多数情况用「filter + Set」最稳妥。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











