JavaScript中内置对象——数组本身拥有排序方法array.sort()
关于这个方法很多人都有误区,我也不例外,我也是踩着坑过来的。
在某些数组下这个方法会默认按照从小到大的方式排序
var arr=[1,3,4,2,5,7,9,8,6]; arr=arr.sort(); alert(arr); //[1,2,3,4,5,6,7,8,9] OK
换一个数组看看,这个方法立马很诡异了
var arr=[1,11,22,111]; arr=arr.sort(); alert(arr); //[1,11,111,22] error
why?问题出在哪里?为什么换个数组这个方法就不行了。
如果我们查阅JavaScript核心API的话会发现,array.sort()默认是按照字符编码的顺序来对数组中的元素进行排序的。
如果我们的数组中元素不是字符串的话,它会默认将把数组的元素都转换成字符串,以便进行比较。
现在我们手动把111转化成“111”,22转化成“22”,然后比较就会发现"22">"111".
alert("22"<"111") // false
好了,问题的症结已经被我们发现了。
回到标题,如何让数组按照我们希望的方式来排序呢?
array.sort()为我们提供强大的参数orderfunc.
解决方法:array.sort(orderfunc)
function orderfunc(a,b){ return a-b; }
var arr=[1,11,22,111];
arr=arr.sort(orderfunc);
alert(arr); //[1,11,22,111] ok
如何我们需要从大到小的顺序排序的话,把b放在a前面即可。
function orderfunc(a,b){ return b-a; } var arr=[1,11,22,111]; arr=arr.sort(orderfunc); alert(arr); //[111,22,11,1]
总结:字符串比较与数值比较截然不同。