代码之家  ›  专栏  ›  技术社区  ›  Devmix

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

  •  13
  • Devmix  · 技术社区  · 6 年前

    我有这个阵列:

    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 回复  |  直到 6 年前
        1
  •  5
  •   CertainPerformance    6 年前

    .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 ]));
        2
  •  8
  •   Fullstack Guy    6 年前

    oddSorted map

    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));
        3
  •  0
  •   Tanmoy Krishna Das    6 年前

    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()。