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

如何在JavaScript中对数组奇数升序排序且保留偶数位置?

解决数组奇数排序、偶数位置不变的问题

嘿,作为JavaScript新手遇到这个问题真的很正常,咱们一步步拆解来搞定它,保证你能吃透背后的逻辑!

核心思路拆解

要实现“只排序奇数,偶数位置不动”,其实可以拆成两个关键步骤:

  1. 把原数组里的所有奇数提取出来,单独做升序排序
  2. 遍历原数组,遇到奇数就用排序好的奇数依次替换,遇到偶数则直接保留原位

具体代码实现

function sortArray(arr) {
  // 第一步:提取所有奇数并做升序排序
  const sortedOdds = arr.filter(num => num % 2 !== 0).sort((a, b) => a - b);
  
  // 第二步:遍历原数组,替换奇数位置的元素
  return arr.map(num => {
    // 如果是奇数,从排序好的奇数数组里取出第一个元素(shift会删除并返回第一个元素)
    if (num % 2 !== 0) {
      return sortedOdds.shift();
    }
    // 偶数直接返回,保持位置不变
    return num;
  });
}

// 测试你的示例
console.log(sortArray([5, 3, 2, 8, 1, 4])); // 输出: [1, 3, 2, 8, 5, 4]

代码细节解释

  • arr.filter(num => num % 2 !== 0):筛选出数组里所有的奇数,比如示例里会得到[5,3,1]
  • .sort((a, b) => a - b):对奇数数组做升序排序,这里一定要加(a,b)=>a-b!不然JS默认的sort()会把数字当成字符串排序,结果会出错,排序后得到[1,3,5]
  • arr.map(...):遍历原数组的每一个元素,判断类型:
    • 如果是奇数,用sortedOdds.shift()取出排序好的奇数数组的第一个元素(取完后这个元素会从sortedOdds里移除,保证下一个奇数能拿到下一个排序好的数)
    • 如果是偶数,直接返回原数,完全不改变它的位置

额外小提示

如果你担心shift()会修改临时数组(其实这里sortedOdds是我们自己创建的临时数组,完全没问题),也可以用一个指针来追踪当前要取的奇数位置,写法更直观:

function sortArray(arr) {
  const sortedOdds = arr.filter(num => num % 2 !== 0).sort((a, b) => a - b);
  let oddIndex = 0;
  return arr.map(num => {
    if (num % 2 !== 0) {
      return sortedOdds[oddIndex++];
    }
    return num;
  });
}

这个写法和之前的效果完全一致,只是用指针代替了shift(),你可以选自己觉得更顺手的方式~

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 12:30:42