如何在JavaScript中创建含任意数量数组共有元素的数组?
解决多数组交集问题的正确实现
你的代码只处理前两个数组的原因很明确:循环第一次执行时就直接return了,后面的参数根本没机会参与计算,而且当循环到最后一个数组时,arguments[i+1]会是undefined,调用includes还会报错。
下面是两种用高阶函数实现多数组交集的可行方案:
方案一:利用reduce逐步缩小交集范围
function intersection() { if (arguments.length === 0) return []; // 把类数组的arguments转换为真实数组 const arrays = Array.from(arguments); // 以第一个数组为初始值,依次和后续每个数组取交集 return arrays.reduce((currentIntersection, nextArray) => { return currentIntersection.filter(item => nextArray.includes(item)); }); }
方案二:用filter+every直接筛选全局存在的元素
function intersection() { if (arguments.length === 0) return []; // 解构出第一个数组和剩余所有数组 const [firstArray, ...otherArrays] = Array.from(arguments); // 筛选出第一个数组中,在所有剩余数组里都存在的元素 return firstArray.filter(item => { return otherArrays.every(array => array.includes(item)); }); }
测试示例
console.log(intersection([1,2,3], [2,3,4], [3,4,5])); // 输出 [3] console.log(intersection([1,2], [1,2], [1])); // 输出 [1] console.log(intersection([5])); // 输出 [5] console.log(intersection()); // 输出 []
原代码的核心问题
- 循环仅执行一次就
return,后续参数完全被忽略 - 未处理参数为空或只有一个数组的边界情况
- 当遍历到最后一个数组时,
arguments[i+1]为undefined,调用includes会抛出错误
内容的提问来源于stack exchange,提问作者Umino
相关产品推荐
相关产品推荐

