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

JavaScript数组奇偶元素分离:为何偶数顺序不符合预期?

问题解析:为什么偶数部分顺序反转了?

这问题我当初刚学JS的时候也踩过坑!咱们先搞清楚你的代码到底发生了什么,再给你几个靠谱的解决办法。

为什么会出现[1, 3, 5, 7, 9, 4, 8, 6, 2]这种结果?

你的代码逻辑是遍历数组,碰到偶数就用splice(i,1)删掉它,再push到数组末尾。但问题出在循环遍历的是数组的动态长度,而且每次splice会改变数组结构:

  1. 第一次碰到偶数2,把它移到末尾,数组变成[1,3,4,5,6,7,8,9,2],此时数组长度从9变成10,循环还会继续。
  2. 当i递增到后面的位置时,会再次碰到已经被移到末尾的2,又把它splice出来再push一次——相当于把早被移过去的偶数一次次往后挤,最后原本的顺序就完全反转了。
  3. 同时,每次splice会让后面的元素往前挪一位,但你的i还在递增,导致中间有些元素的处理逻辑也被打乱,最终偶数顺序彻底错乱。

正确的实现方式

方式1:拆分两个数组再合并(最直观不易错)

这种方法完全避免了原数组修改带来的问题,逻辑清晰:

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

for (const num of arr) {
  num % 2 === 0 ? evens.push(num) : odds.push(num);
}

const sortedArr = odds.concat(evens);
console.log(sortedArr); // 输出 [1,3,5,7,9,2,4,6,8]

方式2:倒序遍历原数组(原地修改的正确姿势)

如果一定要在原数组上操作,倒序遍历就不会重复处理已经移到末尾的偶数:

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

for (let i = arr.length - 1; i >= 0; i--) {
  if (arr[i] % 2 === 0) {
    arr.push(arr.splice(i, 1)[0]);
  }
}

console.log(arr); // 输出 [1,3,5,7,9,2,4,6,8]

方式3:限制遍历原长度,调整索引

如果你习惯正序遍历,那就固定循环原数组的长度,每次splice后把索引减1,避免跳过元素:

var arr = [1, 2, 3, 4, 5, 6, 7, 8, 9];
const originalLength = arr.length;

for (let i = 0; i < originalLength; i++) {
  if (arr[i] % 2 === 0) {
    arr.push(arr.splice(i, 1)[0]);
    i--; // splice后元素前移,索引回退一位
  }
}

console.log(arr); // 输出 [1,3,5,7,9,2,4,6,8]

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 08:37:01