嵌套for循环内层无法识别外层变量,报Cannot read property 'length' of undefined错误
报错原因
- 核心问题是遍历数组的过程中直接修改原数组长度,导致索引错位:
你调用splice(e,1)删除当前子数组后,原数组arr的长度会直接减1,后续外层循环e继续自增时,会跳过下一个元素,甚至超出修改后的数组长度,访问到值为undefined的arr[e],读取arr[e].length就会触发你遇到的类型错误。 - 额外逻辑缺陷:你删除子数组后没有终止内层循环,依然会继续访问已经被删除位置的元素,进一步加剧错误。
修复方案
方案1:不修改原数组,直接构建结果数组(最推荐)
完全避免操作原数组带来的索引问题,逻辑简单易读:
function filteredArray(arr, elem) { let newArr = []; for (let e = 0; e < arr.length; e++) { // 只要当前子数组不包含elem,就加入结果 if (!arr[e].includes(elem)) { newArr.push(arr[e]); } } return newArr; }
如果要简化实现可以直接用数组内置的filter方法:
function filteredArray(arr, elem) { return arr.filter(subArr => !subArr.includes(elem)); }
方案2:坚持修改原数组的实现
如果一定要在原数组上操作,可以在删除元素后手动将外层索引e减1,抵消后续的自增,同时删除后直接break内层循环:
function filteredArray(arr, elem) { for(let e = 0; e < arr.length; e++) { for (let j = 0; j < arr[e].length; j++) { if(arr[e][j] == elem) { arr.splice(e, 1); e--; // 索引回退,避免跳过下一个元素 break; // 终止当前子数组的遍历,避免访问已删除的元素 } } } return arr; }
两种方案都可以完全符合你给出的四个用例的预期输出。
内容的提问来源于stack exchange,提问作者izzypt
相关产品推荐
相关产品推荐

