filteredArray函数异常:为何仅嵌套子数组首元素为指定值时生效?
问题分析与修复:filteredArray函数过滤嵌套数组失效问题
原代码失效的原因
你的代码只在元素位于子数组开头时生效,核心问题出在遍历原数组的同时修改原数组,导致循环索引错乱,具体问题点如下:
数组长度变化导致索引跳过元素
当你用splice删除原数组中的子数组时,原数组的长度会立即缩短。比如初始数组有4个子数组,当i=0时删除第一个子数组,数组长度变为3,i递增到1后,会直接访问原数组的第三个元素(现在的第二个),而原数组的第二个元素(比如[1,6,3])会被完全跳过,根本没机会被检查是否包含目标元素。不必要的内层循环持续执行
内层循环找到目标元素后,没有终止循环,会继续检查当前子数组的其他元素,可能导致多次尝试删除同一个子数组(但此时该子数组已经被移除,arr.indexOf(myNestedArray)会返回-1,splice操作无效)。返回结果结构错误
你最后将修改后的原数组push到newArr中,导致返回的是嵌套数组(比如[[...]]),但题目要求直接返回过滤后的子数组组成的数组。
修复后的代码
方案1:使用双层for循环(符合题目要求的for循环实现)
function filteredArray(arr, elem) { let newArr = []; // 遍历每个子数组 for (let i = 0; i < arr.length; i++) { let containsElem = false; // 检查当前子数组是否包含目标元素 for (let j = 0; j < arr[i].length; j++) { if (arr[i][j] === elem) { containsElem = true; break; // 找到元素后立即终止内层循环,避免无效检查 } } // 只保留不包含目标元素的子数组 if (!containsElem) { newArr.push(arr[i]); } } return newArr; } console.log(filteredArray([[3, 2, 3], [1, 6, 3], [3, 13, 26], [19, 3, 9]], 3)); // 输出:[],因为所有子数组都包含3
方案2:用includes简化内层逻辑(更简洁)
如果允许使用数组方法,includes可以直接判断子数组是否包含目标元素,省去内层循环:
function filteredArray(arr, elem) { let newArr = []; for (let i = 0; i < arr.length; i++) { if (!arr[i].includes(elem)) { newArr.push(arr[i]); } } return newArr; }
关键改进点
- 不修改原数组,而是通过筛选将符合条件的子数组添加到新数组,避免遍历过程中索引错乱。
- 找到目标元素后立即终止内层循环,提升效率。
- 直接返回筛选后的新数组,符合题目要求的返回结构。
内容的提问来源于stack exchange,提问作者Mohammed
相关产品推荐
相关产品推荐

