JavaScript数组奇偶元素分离:为何偶数顺序不符合预期?
问题解析:为什么偶数部分顺序反转了?
这问题我当初刚学JS的时候也踩过坑!咱们先搞清楚你的代码到底发生了什么,再给你几个靠谱的解决办法。
为什么会出现[1, 3, 5, 7, 9, 4, 8, 6, 2]这种结果?
你的代码逻辑是遍历数组,碰到偶数就用splice(i,1)删掉它,再push到数组末尾。但问题出在循环遍历的是数组的动态长度,而且每次splice会改变数组结构:
- 第一次碰到偶数
2,把它移到末尾,数组变成[1,3,4,5,6,7,8,9,2],此时数组长度从9变成10,循环还会继续。 - 当
i递增到后面的位置时,会再次碰到已经被移到末尾的2,又把它splice出来再push一次——相当于把早被移过去的偶数一次次往后挤,最后原本的顺序就完全反转了。 - 同时,每次
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
相关产品推荐
相关产品推荐

