如何修复JS嵌套数组过滤代码中的TypeError问题?
修复嵌套数组过滤的TypeError问题
你的代码目标是返回移除所有包含指定元素elem的嵌套数组后的结果,但运行时触发了TypeError: Cannot read properties of undefined (reading 'length')错误,且当前逻辑无法得到预期的[]结果。
错误原因
- 数组索引错乱:使用
splice(i, 1)删除元素后,newArr的长度会立即减少,后续元素会向前移动一位,但循环变量i仍在递增。例如原数组长度为4,删除第一个元素后长度变为3,当i递增到3时,newArr[3]不存在(数组最大索引为2),此时访问newArr[i].length就会抛出undefined错误。 - 逻辑冗余且有漏洞:先将所有子数组推入
newArr再删除,不仅多余,还可能因为一个子数组多次匹配elem而重复执行splice,导致错误删除其他元素。
修复后的代码
function filteredArray(arr, elem) { let newArr = []; // Only change code below this line for (let i = 0; i < arr.length; i++) { let containsElem = false; // 遍历当前子数组,检查是否包含指定元素 for (let k = 0; k < arr[i].length; k++) { if (arr[i][k] === elem) { containsElem = true; break; // 找到元素后直接终止内层循环,提升效率 } } // 只有当子数组不包含elem时,才推入新数组 if (!containsElem) { newArr.push(arr[i]); } } // Only change code above this line return newArr; } console.log(filteredArray([[3, 2, 3], [1, 6, 3], [3, 13, 26], [19, 3, 9]], 3)); // 输出 []
修复思路
换一种正向判断的逻辑:直接遍历原数组的每个子数组,检查该子数组是否包含elem——如果不包含,就将其加入newArr。这种方式不需要修改数组长度,避免了索引错乱的问题,同时逻辑更清晰高效。
内容的提问来源于stack exchange,提问作者Fatih Soyalp
相关产品推荐
相关产品推荐

