Javascript 中 Array的 sort()方法其實是把要排序的內容轉化為string(調用 toString()), 然后按照字符串的第一位 ascii 碼先后順序進行比較,不是數字。
我們看看官方是怎么說的:
arrayobj.sort(sortfunction)
參數
arrayObj
必選項。任意 Array 對象。
sortFunction
可選項。是用來確定元素順序的函數的名稱。如果這個參數被省略,那么元素將按照 ASCII 字符順序進行升序排列。
說明
sort 方法將 Array 對象進行適當的排序;在執行過程中並不會創建新的 Array 對象。
如果為 sortfunction 參數提供了一個函數,那么該函數必須返回下列值之一:
- 負值,如果所傳遞的第一個參數比第二個參數小。
- 零,如果兩個參數相等。
- 正值,如果第一個參數比第二個參數大。
<html> <head> <script type="text/javascript"> var arr = [1,3, 25];
arr.sort(); alert(arr); </script> </head> <body> </body> </html>
結果: 1,25,3
那么怎么辦呢?我們可以寫一個 compare() 方法
<html> <head> <script type="text/javascript"> var arr = [ 1, 3, 25 ]; arr.sort(compare); //函數名是對象的引用,所以只寫名字就行。 alert(arr); function compare(num1, num2) { var temp1 = parseInt(num1); var temp2 = parseInt(num2); if (temp1 < temp2) { return -1; } else if (temp1 == temp2) { return 0; } else { return 1; } } </script> </head> <body> </body> </html>
結果: 1,3,25
我們可以把上面代碼改寫成匿名類的方式:
<html> <head> <script type="text/javascript"> var arr = [ 1, 3, 25 ]; arr.sort(function (num1, num2) { var temp1 = parseInt(num1); var temp2 = parseInt(num2); if (temp1 < temp2) { return -1; } else if (temp1 == temp2) { return 0; } else { return 1; } } ) alert(arr); </script> </head> <body> </body> </html>
結果一樣: 1,3, 25