JavaScript嵌套数组使用for循环删除指定元素结果异常求助
问题原因
- 你在正序遍历子数组的同时使用
splice删除元素,会导致数组长度实时收缩,但循环变量j仍然正常累加,会直接跳过被删除元素的下一个元素,出现漏判:
以全4的子数组[4,4,4,4]为例,第一次遍历j=0匹配到4后删除,数组变为[4,4,4],此时j自增到1,就跳过了现在处于索引0位置的4,以此类推最终只会删除一半的目标元素。
解决方案
这里提供两种成熟的修复方案:
方案1:删除元素后回退循环变量
修改内层循环逻辑,匹配到目标元素删除后主动将j减1,抵消后续的自动累加,避免跳过元素:
let newArr = [[1,5,6,4],[8,5,4],[4,4,4,4]]; function filterArr(arr, elemn){ for(let i = 0; i < arr.length; i++){ for(let j=0; j < arr[i].length; j++){ if(arr[i][j] === elemn){ arr[i].splice(j,1); j--; // 新增本行回退索引 } } } return arr; } console.log(filterArr(newArr,4)); // 输出 [[1,5,6],[8,5],[]]
方案2:使用数组内置filter方法,逻辑更简洁不易出错
不需要手动控制循环索引,直接调用原生方法生成符合要求的新数组即可:
let newArr = [[1,5,6,4],[8,5,4],[4,4,4,4]]; function filterArr(arr, elemn){ return arr.map(subArr => subArr.filter(item => item !== elemn)); } console.log(filterArr(newArr,4)); // 输出 [[1,5,6],[8,5],[]]
补充说明
- 方案1会直接修改原始输入数组,如果不需要保留原数组可以使用;方案2会生成全新数组,不会改动原始输入,更符合纯函数规范,优先推荐使用。
- 所有边遍历边增删数组元素的场景,都要注意索引错位问题,要么调整索引要么使用倒序遍历,避免出现漏判。
内容的提问来源于stack exchange,提问作者Abdulhameed Sabur
相关产品推荐
相关产品推荐

