【问题标题】:How to sort even numbers ascending and odd numbers descending in an array?如何对数组中的偶数升序和奇数降序排序?
【发布时间】:2019-09-08 23:33:18
【问题描述】:

我不知道如何在偶数右侧按降序对奇数进行排序。我有点卡在这里,我知道我错过了一些东西。

我的输出是这样的:[2, 4, 6, 8, 10, 1, 3, 5, 7, 9]

应该是这样的:[2, 4, 6, 8, 10, 9, 7, 5, 3, 1]

var n = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
n.sort(function(a, b) {
  return a % 2 - b % 2 || b % 2 - a % 2;
});
console.log(n);

【问题讨论】:

    标签: javascript arrays


    【解决方案1】:

    您是否尝试将数组拆分为两个数组(一个为偶数,一个为奇数),然后根据需要对每个数组进行排序并使用扩展运算符 [...even, ...odd] 将它们连接回来

    var n = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
    var even = n.filter(a => a % 2 == 0).sort();
    var odd = n.filter(a => a % 2 != 0).sort().reverse();
    var numbers = [...even, ...odd];
    

    【讨论】:

      【解决方案2】:

      一个简单且非常昂贵的解决方案是构建两个数组,对它们进行排序然后将它们连接起来,但是您可以将这两个测试结合起来并像这样进行排序:

      arr.sort((a,b)=> (a%2-b%2) || (a%2 ? b-a : a-b))
      

      如您所见,分层排序的模式只是

      arr.sort(compareA || compareB) 
      

      您可以将其概括为更多条件。

      let arr = Array.from({length:10}, (_,i)=>i+1)
      arr.sort((a,b)=> (a%2-b%2) || (a%2 ? b-a : a-b))
      console.log(arr)

      【讨论】:

      • 代码没有给出正确的输出。奇数应按降序排列
      • 你可能误会了。请参阅 OP 所说的 cmets。
      【解决方案3】:

      您可以使用filter() 获取不同的偶数和奇数数组,然后对它们进行排序并使用扩展运算符连接

      var n = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
      let odd = n.filter(x => x % 2).sort((a,b) => b-a);
      
      let even = n.filter(x => !(x % 2) ).sort((a,b) => a-b);
      
      let res = [...even,...odd]
      
      console.log(res);

      【讨论】:

      • 这比必要的贵
      【解决方案4】:

      您可以过滤奇数和偶数,并对它们进行排序,最后连接两个数组。

      let n = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
      let odds = n.filter((a) => a % 2 !== 0).sort((a, b) => b - a);
      let even = n.filter((a) => a % 2 === 0).sort((a, b) => a - b);
      let sorted = even.concat(odds);
      console.log(sorted);
      .as-console-wrapper { min-height: 100%; }

      【讨论】:

      • OP:类似这样的 [2, 4, 6, 8, 10, 9, 7, 5, 3, 1] -- 几率也必须下降..
      • 非常感谢,这对我有用,我明白我做错了什么
      【解决方案5】:

      您可以将两个数组分开并通过扩展运算符合并。

      let n = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
      let odd  = n.filter (v => v % 2);
      odd.sort((a,b) => b-a);
      //console.log(odd)
      let even = n.filter (v => !(v % 2));
      even.sort((a,b) => a-b);
      //console.log(even);
      
      console.log([...even,...odd]);
      

      var n = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
      odd  = n.filter (v => v % 2);
      odd.sort((a,b) => b-a);
      //console.log(odd)
      even = n.filter (v => !(v % 2));
      even.sort((a,b) => a-b);
      //console.log(even);
      
      console.log([...even,...odd]);

      【讨论】:

      • 您正在声明隐式全局变量。我的答案和你的答案也没有区别。我想你没有看到我的。
      • 我更新了答案,之前当然不知道你的答案
      • 我删除了反对票。但是重复答案并不好。我不是说你抄袭我的。你不需要。但是给出与其他答案完全相同的答案并不是那么好。在你的 sn-p 中使用let
      • 我在sn-p写代码的时候是全屏的,看不到你的回答,你不要这么想
      • 我明白没问题。
      猜你喜欢
      • 1970-01-01
      • 2022-12-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-10-24
      • 2017-05-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多