必须倒序遍历删除数组元素,因正序删除会致后续元素前移、索引错位而漏删;逆序则确保未检查元素索引不变,安全可靠。

逆序删除数组中特定元素时,必须从数组末尾开始遍历,否则正序删除会导致索引错位、漏删或越界。核心原因是:每次 splice 删除一个元素后,后续元素会向前补位,原下标对应的元素已改变。
为什么必须倒着循环?
假设数组 [1, 2, 2, 3, 2],要删除所有 2:
- 正序(i = 0 开始):删掉索引 1 的 2 后,第二个 2 移到索引 1,但循环已走到 i = 2,直接跳过它;
- 逆序(i = length - 1 开始):删除不影响前面未检查的索引,每删一个,只影响已处理过的高位,安全可靠。
基础写法:for 循环 + splice
适用于需原地修改原数组的场景:
const arr = [1, 2, 2, 3, 2, 4];
const target = 2;
<p>for (let i = arr.length - 1; i >= 0; i--) {
if (arr[i] === target) {
arr.splice(i, 1);
}
}</p><p>console.log(arr); // [1, 3, 4]
</p>更灵活:支持条件函数和多值匹配
用函数判断是否删除,可适配复杂逻辑(如删除偶数、字符串包含某字符等):
function removeByCondition(arr, condition) {
for (let i = arr.length - 1; i >= 0; i--) {
if (condition(arr[i], i, arr)) {
arr.splice(i, 1);
}
}
}
<p>// 示例:删除所有偶数
removeByCondition([1, 2, 3, 4, 5, 6], x => x % 2 === 0);
// → [1, 3, 5]</p><p>// 示例:删除空字符串或 undefined
removeByCondition(['a', '', undefined, 'b'], x => x == null || x === '');
// → ['a', 'b']
</p>注意点与替代建议
不要用 filter 原地修改:它返回新数组,原数组不变;若需保留原引用,仍得用逆序 for + splice。
避免在循环中修改 length:不要写 i ,因为 <code>arr.length 动态变化,应提前缓存或用 i >= 0 控制。
性能考虑:对超大数组(如 >10 万项),频繁 splice 开销较大,此时可先收集索引再批量删除,或改用 filter 生成新数组更高效。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











