奇怪的JavaScript排序错误

时间:2018-01-11 07:06:33

标签: javascript google-chrome firefox

当这个序列被排序时,我在JS中遇到了这个奇怪的排序错误:

console.log([10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 9].sort());

输出

[10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 9]

所以我尝试了其他几个案例,其中最后9个是0 - 8.排序按0和1的预期工作,但是对于2到9之间的数字,序列没有排序。

[0, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26]
[10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 5]

Firefox和Chrome上的行为相同

我不知道还有什么去,所以我虽然在这里分享。

测试:https://jsbin.com/lixasowubi/edit?js,console

2 个答案:

答案 0 :(得分:1)

  

默认情况下,sort()方法将值排序为字符串   按字母顺序排列。

     

这适用于字符串(" Apple"来自" Banana")。然而,   如果数字按字符串排序," 25"大于" 100",因为   " 2"大于" 1"。

https://www.w3schools.com/jsref/jsref_sort.asp

要按数字排序,请使用

.sort(function(a, b) {return a - b }) // Ascending
.sort(function(a, b) {return b - a }) // Descending

答案 1 :(得分:0)

Javascript按字母顺序排序。这意味着" 10"低于" 5",因为" 1"低于" 5"。

要对数值进行排序,您需要传递数字比较器,如下所示:

function sorter(a, b) {
  if (a < b) return -1;  // any negative number works
  if (a > b) return 1;   // any positive number works
  return 0; // equal values MUST yield zero
}

[1,10, 5].sort(sorter);
Or you can cheat by passing simpler function:

function sorter(a, b){
  return a - b;
}

[1, 10, 5].sort(sorter);

这个较短函数背后的逻辑是,如果&gt;比较器必须返回x> 0。 b,如果&lt; 0,则x <0。 b如果a等于b,则为零。所以万一你有

a = 1 b = 5 a-b将产生负(-4)数,意味着b大于a

a = 5 b = 1 a-b将产生正数(4),意味着a大于b

a = 3 b = 3 a-b将产生0意味着它们是相等的