默认情况下,sort()方法会从小到大的排列数组中的每一项,为了实现排序, sort()方法会调用每个数组项的 toString()转型方法,然后比较得到的字符串,以确定如何排序。
但是sort排序时,会调用数组每一项的toString()转型方法,然后比较所得的字符串,已确定如何排序。即使数组中每一项都是数组,sort()方法比较的也是字符串。
var values = [0, 1, 5, 10, 15];
values.sort();
console.log(values) // [0, 1, 10, 15, 5]
这里虽然10比5大,但是字符串比较时,10比5小,所以会出现10在5的前面。
"1">"5"
false
"6">"5"
true
"1">"0.5"
true
"abc">"aabdfg"
true
既然碰到了,就补充一下这方面的知识:
为什么会是这样呢?
字符是ASCII值确定,比较规则是,从第一个字符开始,顺次向后直到出现不同的字符为止,然后以第一个不同的字符的ASCII值确定,例如上面的”abc”和”aabdfg”,由于第一个字符相同,都是’a’所以看下一个字符,第二个字符,一个是’b’,一个是‘a’,由于b的ASCII值比a的ASCII值大,所以,这二个字符串的比较结果是”abc”>”aabdfg”。
然后我们回到正题:
因为sort()方法默认使用的是字符串比较方法,这个不靠谱,所以为了让它靠谱,它可以接收一个比较函数作为参数,以便我们指定哪个值位于哪个值的前面。
比较函数的原理:
比较函数接收两个参数 a、b,
如果a < b,则返回一个负数,表示第一个参数应该位于第二个之前;
如果a = b,则返回 0,表示这两个参数的位置不变;
如果a > b,则返回一个正数,表示第一个参数应该位于第二个之后。
比较函数:
function compare(value1, value2) {
if (value1 < value2) {
return 1;
} else if (value1 > value2) {
return -1;
} else {
return 0;
}
}
简写:
function compare(value1, value2) {
return value1 - value2;
}
举个栗子:
function compare(value1, value2) {
return value1 - value2;
}
var values = [0, 1, 5, 10, 15];
values.sort(compare);
console.log(values);
//[0, 1, 5, 10, 15]
如果需要逆序排列,就把返回的正负值颠倒过来。
function compare(value1, value2) {
if (value1 < value2) {
return - 1;
} else if (value1 > value2) {
return 1;
} else {
return 0;
}
}
当然也可以简写:
function compare(value1, value2) {
return value2 - value1;
}
举个栗子:
function compare(value1, value2) {
return value2 - value1;
}
var values = [0, 1, 5, 10, 15];
values.sort(compare);
console.log(values)
//[15, 10, 5, 1, 0]
如何判断逆序或者顺序?
对于简化版函数来说,
拿前者减后者,就是顺序排列,
拿后者减前者,就是逆序排列。
今天sort方法,不再是问题,开心。