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

时间:2019-01-19 05:55:17

标签: javascript

我有这个数组:

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

我正尝试仅对奇数值的元素进行排序,所以我想要

输出:

[1, 3, 2, 8, 5, 4]

您可以看到偶数元素不会更改其位置。谁能告诉我我所缺少的吗?这是我的代码:

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]));

我知道我可以使用slice将元素添加到数组中,但是我对如何获取索引并将元素放入数组中感到困惑。

3 个答案:

答案 0 :(得分:8)

首先仅对奇数数字进行排序,然后将其放入数组oddSorted中。然后map遍历原始数组中的每个元素,并检查当前元素是否为 odd ,如果 odd 将其替换为{{1 }}数组。

oddSorted

答案 1 :(得分:5)

一种选择是跟踪原始数组中的奇数索引,然后.reduce进行排序和排序之后,从排序的奇数数组中进行遍历原始奇数索引并重新分配:< / p>

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 ]));

答案 2 :(得分:0)

我稍微修改了您的代码以实现您的目标。在下面看看

function myFunction(array) {

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

    var index = 0;
    var finalElements = [];
    for(var i=0; i<array.length; i++) {
        var element = array[i];
        if(element %2 !==0) {
            finalElements.push(oddElements[index]);
            index++;
        } else {
            finalElements.push(element);
        }
    }
    return finalElements;
}
console.log(myFunction([5, 3, 2, 8, 1, 4, 11]));

请记住,默认的排序功能按字母顺序对值进行排序。这就是为什么您不能只使用arr.sort()