如何对数组中的元素进行排序而不更改其他元素索引?

pro*_*ogx 14 javascript

我有这个数组:

var arr = [5, 3, 2, 8, 1, 4];
Run Code Online (Sandbox Code Playgroud)

我正在尝试排序奇数值的元素,所以我想要这个

输出:

[1, 3, 2, 8, 5, 4]
Run Code Online (Sandbox Code Playgroud)

如你所见,偶数元素不会改变它们的位置.谁能告诉我我错过了什么?这是我的代码:

function myFunction(array) {

  var oddElements = array.reduce((arr, val, index) => {
    if (val % 2 !== 0){
      arr.push(val);
    }
    return arr.sort();
  }, []);

  return oddElements;
}
console.log(myFunction([5, 3, 2, 8, 1, 4]));
Run Code Online (Sandbox Code Playgroud)

我知道我可以使用slice将元素添加到数组中,但我仍然坚持如何获取索引并将元素放入数组中.

Ful*_*Guy 8

首先只排序奇数并将其放入数组中oddSorted.然后map通过原始数组中的每个元素检查当前元素是否为奇数,如果奇数将其替换为oddSorted数组中相应的已排序数字.

function sortOddElements(arr){
   var oddSorted = arr.filter(ele => ele %2 != 0).sort((a, b) => a - b);
   var evenNotSorted = arr.map((ele, idx) => {
       if(ele % 2 != 0){
           return oddSorted.shift(); 
       }
       return ele;
     });
   return evenNotSorted;
}
var arr = [5, 3, 2, 8, 1, 4];
console.log(sortOddElements(arr));
arr = [5, 3, 2, 8, 1, 4, 11 ];
console.log(sortOddElements(arr));
Run Code Online (Sandbox Code Playgroud)


Cer*_*nce 5

一种选择是跟踪原始数组中奇数的指示,并在进行.reduce排序和排序之后,迭代原始的奇数指标并重新分配,取自排序的奇数数组:

function oddSort(array) {
  const oddIndicies = [];
  const newArr = array.slice();
  const sortedOdd = array.reduce((arr, val, index) => {
    if (val % 2 !== 0) {
      arr.push(val);
      oddIndicies.push(index);
    }
    return arr;
  }, [])
    .sort((a, b) => a - b);
  while (oddIndicies.length > 0) {
    newArr[oddIndicies.shift()] = sortedOdd.shift();
  }
  return newArr;
}

console.log(oddSort([5, 3, 2, 8, 1, 4]));
console.log(oddSort([5, 3, 2, 8, 1, 4, 11 ]));
Run Code Online (Sandbox Code Playgroud)