You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何修复JS嵌套数组过滤代码中的TypeError问题?

修复嵌套数组过滤的TypeError问题

你的代码目标是返回移除所有包含指定元素elem的嵌套数组后的结果,但运行时触发了TypeError: Cannot read properties of undefined (reading 'length')错误,且当前逻辑无法得到预期的[]结果。

错误原因

  1. 数组索引错乱:使用splice(i, 1)删除元素后,newArr的长度会立即减少,后续元素会向前移动一位,但循环变量i仍在递增。例如原数组长度为4,删除第一个元素后长度变为3,当i递增到3时,newArr[3]不存在(数组最大索引为2),此时访问newArr[i].length就会抛出undefined错误。
  2. 逻辑冗余且有漏洞:先将所有子数组推入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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 02:15:03