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]
總結:字符串比較與數值比較截然不同。