數組中已經存在兩個可以直接用來排序的方法:reveres()和sort()。
reveres()方法會反轉數組項的順序。
在默認情況下,sort()方法按升序排列數組項——即最小的值位於最前面,最大的值排在最后面。
為了實現排序,sort()方法會調用每個數組項的toString()轉型方法,然后比較得到的字符串,以確定如何排序。即使數組中的每一項都是數值,sort()方法比較的也是字符串,如下所示。
var values = [0,1,5,10,15];
values.sort();
alert(values); // 0,1,10,15,5
可見,即使例子中值的順序沒有問題,但sort()方法也會根據測試字符串的結果改變原來的順序。因為數字5雖然小於10,但在進行字符串比較時,“10”則位於“5”的前面,於是數組的順序就被修改了。不用說,這種排序方式在很多情況下都不是最佳方案。因此sort()方法可以接收一個比較函數作為參數,以便我們制定哪個值位於哪個值的前面。
比較函數接收兩個參數,如果第一個參數應該位於第二個之前則返回一個負數,如果兩個參數相等則返回0,如果一個參數應該位於第二個之后則返回一個正數。以下就是一個簡單的比較函數:
function compare(value1, value2) { if (value1 < value2) { return -1; } else if (value1 > value2) { return 1; } else { return 0; } } var arr = [1, 5, 6, 7, 3, 9]; arr.sort(compare); alert(arr); // 1,3,5,6,7,9
這個比較函數可以適用於大多數數據類型,只要將其作為參數傳遞給sort()方法即可。
在將比較函數傳遞到sort()方法之后,數值任然保持了正確的升序。當然,也可以通過比較函數產生降序排序的結果,只要交換比較函數返回的值即可。
function compare(value1, value2) { if (value1 < value2) { return 1; } else if (value1 > value2) { return -1; } else { return 0; } } var arr = [1, 5, 6, 7, 3, 9]; arr.sort(compare); alert(arr);//9,7,6,5,3,1
對於數值類型或者其valueOf()方法會返回數值類型的對象類型,可以使用一個更簡單的比較函數。這個函數只要用第二個值減第一個值即可。
function compare(value1,value2){ return value2 - value1; }
由於比較函數通過返回一個小於零、等於零或大於零的值來影響排序結果,因此減法操作就可以適當地處理所有這些情況。