You need to enable JavaScript to run this app. 嵌套for循环内层无法识别外层变量,报Cannot read property 'length' of undefined错误
优惠活动
大模型
产品
解决方案
定价
更多

嵌套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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.07 20:51:02