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

filteredArray函数异常:为何仅嵌套子数组首元素为指定值时生效?

问题分析与修复:filteredArray函数过滤嵌套数组失效问题

原代码失效的原因

你的代码只在元素位于子数组开头时生效,核心问题出在遍历原数组的同时修改原数组,导致循环索引错乱,具体问题点如下:

  1. 数组长度变化导致索引跳过元素
    当你用splice删除原数组中的子数组时,原数组的长度会立即缩短。比如初始数组有4个子数组,当i=0时删除第一个子数组,数组长度变为3,i递增到1后,会直接访问原数组的第三个元素(现在的第二个),而原数组的第二个元素(比如[1,6,3])会被完全跳过,根本没机会被检查是否包含目标元素。

  2. 不必要的内层循环持续执行
    内层循环找到目标元素后,没有终止循环,会继续检查当前子数组的其他元素,可能导致多次尝试删除同一个子数组(但此时该子数组已经被移除,arr.indexOf(myNestedArray)会返回-1,splice操作无效)。

  3. 返回结果结构错误
    你最后将修改后的原数组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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 21:17:40