如何在JavaScript中对数组奇数升序排序且保留偶数位置?
解决数组奇数排序、偶数位置不变的问题
嘿,作为JavaScript新手遇到这个问题真的很正常,咱们一步步拆解来搞定它,保证你能吃透背后的逻辑!
核心思路拆解
要实现“只排序奇数,偶数位置不动”,其实可以拆成两个关键步骤:
- 把原数组里的所有奇数提取出来,单独做升序排序
- 遍历原数组,遇到奇数就用排序好的奇数依次替换,遇到偶数则直接保留原位
具体代码实现
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
相关产品推荐
相关产品推荐

