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

如何原地移除数组特定条件元素并实现偶数乘2的原地修改?

原地修改数组:保留偶数并乘2,删除奇数

你用forEach遍历的时候直接用splice会踩坑——因为forEach是按数组初始的索引顺序遍历的,当你删除某个元素后,数组后面的元素会往前挪一位,下一次遍历的索引会跳过这个挪过来的元素,导致部分奇数漏删。

给你两种靠谱的原地修改方案:

方案一:倒序遍历+ splice

倒着遍历数组,删除元素时不会影响还没处理的元素(因为未处理的元素都在当前索引的左边,删除当前元素不会改变它们的位置),同时处理偶数:

const arr = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];

for (let i = arr.length - 1; i >= 0; i--) {
  if (arr[i] % 2 !== 0) {
    arr.splice(i, 1); // 删除当前奇数
  } else {
    arr[i] *= 2; // 偶数乘2
  }
}

console.log(arr); // 输出 [4, 8, 12, 16, 20]

方案二:双指针法(更高效)

如果数组很大,多次splice会导致性能问题(每次splice都是O(n)操作),双指针法是O(n)时间复杂度,更高效:

用一个指针记录要保留元素的位置,遍历数组时把符合条件的元素(偶数乘2)放到这个位置,最后截断数组:

const arr = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
let ptr = 0; // 记录有效元素的存放位置

for (let i = 0; i < arr.length; i++) {
  if (arr[i] % 2 === 0) {
    arr[ptr] = arr[i] * 2; // 处理后放到ptr位置
    ptr++;
  }
}

arr.length = ptr; // 截断数组,去掉后面无效的元素

console.log(arr); // 输出 [4, 8, 12, 16, 20]

为什么forEach不行?

举个例子:当你遍历到索引0的元素1(奇数),用splice(0,1)删除后,数组变成[2,3,4,...],但forEach下一次会去索引1的位置,也就是原来的3,跳过了现在在索引0的2,导致这个元素不会被处理。

内容的提问来源于stack exchange,提问作者Axnyc

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 07:10:25