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
