为什么我的排序不起作用?

时间:2017-01-21 18:21:59

标签: javascript arrays sorting

我正在质疑我现在所知道的一切。

> [ 37, 4, 3, 1, 3, 10, 8, 29, 9, 13, 19, 12, 11, 14, 20, 22, 22, 27, 28, 33, 34 ].sort((a, b) => a > b)
[19, 34, 3, 1, 3, 10, 8, 29, 9, 13, 4, 12, 11, 14, 20, 22, 22, 27, 28, 33, 37]

预计它将从1开始,然后是3(不是19和34)

我尝试过的事情:

[ 37, 4, 3, 1, 3, 10, 8, 29, 9, 13, 19, 12, 11, 14, 20, 22, 22, 27, 28, 33, 34 ].sort(function (a, b) { return a > b })

此外:

[ 37, 4, 3, 1, 3, 10, 8, 29, 9, 13, 19, 12, 11, 14, 20, 22, 22, 27, 28, 33, 34 ].sort(function (a, b) { return +a > +b })

3 个答案:

答案 0 :(得分:3)

通过在比较函数中返回它的差异来对数字数组进行排序。

console.log(
  [37, 4, 3, 1, 3, 10, 8, 29, 9, 13, 19, 12, 11, 14, 20, 22, 22, 27, 28, 33, 34].sort((a, b) => a - b)
)

检查MDN docs以了解返回值的含义,以下内容来自MDN文档:

  1. 如果compareFunction(a,b)小于0 ,请将a排序为低于b的索引,即a先出现。
  2. 如果compareFunction(a,b)返回0 ,则保持a和b相对于彼此保持不变,但是对所有不同的元素进行排序。注意:ECMAscript标准不保证这种行为,因此并非所有浏览器(例如可追溯到至少2003年的Mozilla版本)都尊重这一点。
  3. 如果compareFunction(a,b)大于0 ,则将b排序为低于a的索引。 当给定一对特定元素a和b作为其两个参数时,compareFunction(a,b)必须始终返回相同的值。如果返回不一致的结果,则排序顺序未定义。

答案 1 :(得分:2)

.sort()回调函数应该返回数字响应:

    {li> -1(或任何负数)a< ba == b 时,
  • 0 当a>时,
  • 1(或任何正数) b

您的回调返回一个布尔结果,排序代码将其解释为01。因此,对于某些值对,您的回调将产生相互矛盾的结果。

例如,请考虑数组374中的对。如果在a37b4的情况下调用回调,则您的回调将返回true1)。首先,它应该是倒退的。更重要的是,如果在排序过程的后期再次比较这两个值(这很可能),但是以相反的顺序,你的回调返回0,这又是错误的答案,也是不同的错误答案。

在您的情况下,最简单的方法是用简单的数字减法替换该比较:

 (a, b) => a - b

答案 2 :(得分:2)

要以数字方式排序,您需要添加一个处理数字排序的方法。

var array=[ 37, 4, 3, 1, 3, 10, 8, 29, 9, 13, 19, 12, 11, 14, 20, 22, 22, 27, 28, 33, 34 ];
console.log(array.sort(callback));
function callback(a,b){
    return a-b;
}

比较功能具有以下形式:

function compare(a, b) {
  if (a < b) {
    return -1;
  }
  if (a > b) {
    return 1;
  }
  // a must be equal to b
  return 0;
}