当这个序列被排序时,我在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上的行为相同
我不知道还有什么去,所以我虽然在这里分享。
答案 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意味着它们是相等的