如何实现JavaScript数组交集函数?排查代码结果不符问题
问题分析与修复方案
你的代码逻辑方向偏了,咱们先拆解下问题出在哪:
你的代码核心错误
- 错误的判断逻辑:你把所有数组合并后,通过检查元素是否在合并数组中重复出现来判断是否是交集,但这完全不对——比如元素
1在arr2和arr3里有,但arr1里没有,合并后它会出现两次,但它根本不属于所有数组的交集。 - 数组遍历的致命bug:你在遍历
concatArray的时候用了shift(),这会直接修改原数组的长度和元素位置,导致你的遍历索引i和实际数组元素完全不匹配,最后会把很多不该有的元素塞进结果里。
正确的思路实现
要实现多数组的交集,正确的逻辑应该是:
- 以第一个数组为基准(如果没有输入数组就返回空)
- 遍历基准数组的每个元素,检查这个元素是否存在于所有其他输入数组中
- 同时要注意去重,避免基准数组里的重复元素导致结果重复
下面是修复后的代码:
function intersection(...arrays) { // 如果没有输入数组,直接返回空 if (arrays.length === 0) return []; // 以第一个数组为基准,先去重避免重复检查 const baseArray = [...new Set(arrays[0])]; // 筛选出在所有其他数组里都存在的元素 return baseArray.filter(element => { return arrays.every(arr => arr.includes(element)); }); } const arr1 = [5, 10, 15, 20]; const arr2 = [15, 88, 1, 5, 7]; const arr3 = [1, 10, 15, 5, 20]; console.log(intersection(arr1, arr2, arr3)); // 输出: [5, 15]
代码解释
- 用
...arrays剩余参数接收所有输入数组,调用的时候可以直接传intersection(arr1, arr2, arr3),比传数组的写法更直观 - 先对基准数组去重,避免重复检查同一个元素
- 用
every()方法确保当前元素在所有输入数组中都存在,这才是交集的核心定义 - 最后用
filter()筛选出符合条件的元素,得到最终交集
如果你坚持要保持原函数的调用方式(传一个包含多个数组的数组),那只需要把函数参数改成arrays,调用时传[arr1, arr2, arr3]即可,核心逻辑不变:
function intersection(arrays) { if (arrays.length === 0) return []; const baseArray = [...new Set(arrays[0])]; return baseArray.filter(element => { return arrays.every(arr => arr.includes(element)); }); } console.log(intersection([arr1, arr2, arr3])); // 同样输出: [5, 15]
内容的提问来源于stack exchange,提问作者PineNuts0
相关产品推荐
相关产品推荐

