求助:用for循环替代reduce重构数组交集函数遇问题
数组交集函数重构问题解析
问题背景
挑战要求编写一个intersection函数,接收一个包含多个数组的输入,返回所有输入数组中共同存在的元素组成的新数组。
用户已通过reduce方法实现了该函数(即intersection1),但尝试不使用reduce重构时失败,代码输出1而非预期的[5, 15],需要排查错误并验证思路可行性。
原reduce实现的笔误修正
先纠正原intersection1代码里的变量混淆问题:代码中定义了const newArr = [],但循环里却误用了result.push(ele),正确写法如下:
function intersection1(arrayOfArrays) { return arrayOfArrays.reduce((accumulator, currentValue) => { const newArr = []; accumulator.forEach((ele) => { if (currentValue.includes(ele)) { newArr.push(ele); }; }) return newArr; }); } const arr1 = [5, 10, 15, 20]; const arr2 = [15, 88, 1, 5, 7]; const arr3 = [1, 10, 15, 5, 20]; console.log(intersection1([arr1, arr2, arr3])); // 输出 [5, 15]
重构代码的错误分析
你写的intersection函数存在几个致命问题,导致它直接返回1:
- 提前return终止函数:第一个
for循环里的return cache1.push(arrayOfArrays[i]);会直接终止函数。push方法返回的是数组的新长度,第一次循环时cache1添加了arr1,长度变为1,所以函数直接返回1,后续代码完全不会执行。 - 循环逻辑错误:你想把输入的三个子数组分别存入
cache1、cache2、cache3,但循环写法完全不符合需求:- 第一个循环的
return直接打断流程,无法完成遍历; - 即使去掉
return,第二个循环会把arr2和arr3都存入cache2,第三个循环会存入arr3和undefined(因为arrayOfArrays[3]不存在),完全达不到“每个cache存一个子数组”的效果。
- 第一个循环的
- 元素判断逻辑错误:即使前面的cache正确,
cache1里存的是整个子数组arr1,cache1.forEach遍历的是arr1这个数组而非它的元素,cache2.includes(ele)判断的是cache2里是否包含整个arr1数组,逻辑完全错误。
修正后的非reduce写法
你的核心思路(拿第一个数组的元素,检查是否在所有其他数组中存在)是可行的,修正后的代码如下:
function intersection(arrayOfArrays) { // 边界处理:如果输入为空数组,直接返回空 if (arrayOfArrays.length === 0) return []; const result = []; // 取第一个数组作为基准 const baseArray = arrayOfArrays[0]; // 遍历基准数组的每个元素 for (const ele of baseArray) { // 检查当前元素是否在所有其他数组中都存在 let isCommon = true; for (let i = 1; i < arrayOfArrays.length; i++) { if (!arrayOfArrays[i].includes(ele)) { isCommon = false; break; } } // 如果是共同元素,加入结果数组 if (isCommon) { result.push(ele); } } // 去重(可选,如果需要结果数组无重复元素) return [...new Set(result)]; } 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]
优化点说明
- 增加边界情况处理,避免输入为空时报错;
- 用
for...of遍历基准数组,代码更简洁; - 加入可选的去重逻辑(用
Set),避免基准数组有重复元素时结果数组出现重复; - 逻辑清晰:逐个检查基准元素是否在所有其他数组中存在,完全符合交集的定义。
内容的提问来源于stack exchange,提问作者Silverbear
相关产品推荐
相关产品推荐

