📝 数组交集实现总结
1. for 循环逐个比较
js
function intersection(arrays) {
let result = arrays[0];
for (let i = 1; i < arrays.length; i++) {
result = result.filter(item => arrays[i].includes(item));
}
return result;
}
✅ 简单直观,适合新手
❌ 每次 includes
都是 O(n),大数据时性能差
2. reduce + filter(函数式写法)
js
function intersection(...arrays) {
return arrays.reduce((acc, cur) => acc.filter(item => cur.includes(item)));
}
✅ 一行搞定,语法优雅
❌ 和方法 1 性能一样,难理解一点
3. every 检查法
js
function intersection(...arrays) {
let [first, ...rest] = arrays;
return first.filter(item => rest.every(arr => arr.includes(item)));
}
✅ 逻辑清晰:只要某元素存在于所有数组中就保留
❌ 性能中等,跟 1/2 类似
4. Set 优化
js
function intersection(...arrays) {
return [...arrays.reduce((acc, cur) =>
new Set([...acc].filter(item => cur.includes(item)))
)];
}
✅ 用 Set
去重,避免重复元素,查询更快
❌ 还是会用到 includes
,性能一般
5. Map 计数统计(推荐大数据量)
js
function intersection(...arrays) {
const countMap = new Map();
const total = arrays.length;
for (let arr of arrays) {
for (let item of new Set(arr)) { // 每个数组去重后再计数
countMap.set(item, (countMap.get(item) || 0) + 1);
}
}
return [...countMap.entries()]
.filter(([_, count]) => count === total)
.map(([item]) => item);
}
✅ 高效,适合处理超大数组(避免反复 includes
)
✅ 自动去重,不会有重复元素
❌ 写法复杂一些
📊 方法对比表
方法 | 代码简洁度 | 性能(小数组) | 性能(大数组) | 是否去重 |
---|---|---|---|---|
for 循环 | ⭐⭐⭐ | ⭐⭐⭐ | ⭐ | 否 |
reduce+filter | ⭐⭐⭐⭐ | ⭐⭐⭐ | ⭐ | 否 |
every 检查 | ⭐⭐⭐ | ⭐⭐⭐ | ⭐ | 否 |
Set 优化 | ⭐⭐⭐ | ⭐⭐⭐ | ⭐⭐ | ✅ |
Map 计数 | ⭐⭐ | ⭐⭐ | ⭐⭐⭐⭐ | ✅ |
👉 总结:
- 小数组,简单写 → 方法 1 或 3。
- 追求优雅 → 方法 2。
- 避免重复元素 → 方法 4。
- 大数据量高性能 → 方法 5(Map 计数)。