天天看點

JS程式設計建議——54:增強數組排序的sort功能

建議54:增強數組排序的sort功能

sort方法不僅按字母順序進行排序,還可以根據其他順序執行操作。這時就必須為方法提供一個比較函數的參數,該函數要比較兩個值,然後傳回一個用于說明這兩個值的相對順序的數字。比較函數應該具有兩個參數a和b,其傳回值如下:

1)如果根據自定義評判标準,a小于b,在排序後的數組中a應該出現在b之前,就傳回一個小于0的值。

2)如果a等于b,就傳回0。

3)如果a大于b,就傳回一個大于0的值。

在下面的示例中,将根據比較函數來比較數組中每個元素的大小,并按從小到大的順序執行排序:

function f( a, b ){

}

var a = [3, 1, 2, 4, 5, 7, 6, 8, 0, 9]; // 定義數組

a.sort(f);

alert( a ); //[0,1,2 ,3,4, 5,6,7 ,8,9]

如果按從大到小的順序執行排序,則讓傳回值取反即可,代碼如下:

var a = [3, 1, 2, 4, 5, 7, 6, 8, 0, 9];

alert( a ); //[9,8,7 ,6,5, 4,3,2 ,1,0]

(1)根據奇偶性質排列數組

sort方法用法比較靈活,但更靈活的是對比較函數的設計。例如,要根據奇偶數順序排列數組,隻需要判斷比較函數中兩個參數是否為奇偶數,并決定排列順序,代碼如下:

a.sort( f );

alert( a ); //[3,1,5,7,9,0,8,6,4,2]

sort方法在調用比較函數時,将每個元素值傳遞給比較函數,如果元素值為偶數,則保留其位置不動;如果元素值為奇數,則調換參數a和b的顯示順序,進而實作對數組中所有元素執行奇偶排序。如果希望偶數排在前面,奇數排在後面,則隻需要取傳回值。比較函數如下:

(2)不區分大小寫排序字元串

在正常情況下,對字元串進行排序是區分大小寫的,這是因為每個字母大寫形式和小寫形式在字元編碼表中的順序是不同的,大寫形式排在小寫形式前面,例如:

var a = ["aB", "Ab", "Ba", "bA"];

a.sort();

alert( a ); //["Ab","Ba","aB","bA"]

也就是說,同一字母大寫形式總是排在左側,而小寫形式總是排在右側。如果讓小寫形式總是排在前面,則可以這樣設計:

在比較字母大小時,JavaScript根據字元編碼大小來決定字母的大小,當比較函數的傳回值為true時,則傳回1;當比較函數的傳回值為false時,則傳回–1。如果不希望區分字母大小,也就是說,大寫字母和小寫字母按相同順序排列,則可以這樣設計:

var a = ["aB", "Ab", "Ba", "bA"]; // 定義數組

alert( a ); //["aB", "Ab", "Ba", "bA"]

如果要調整排序順序,則對傳回值取反即可。

(3)把浮點數和整數分開排列

經常會遇到把浮點數和整數分開排列的情況。當然,借助sort方法實作起來并不是很難,我們可以這樣設計:

var a = [3.55555, 1.23456, 3, 2.11111, 5, 7, 3];

alert( a ); //[3,5,7,3,2.11111,1.23456,3.55555]

sort方法的功能是非常強大的,如果比較的元素是對象而不是值類型(如數字和字元串等)這樣簡單的資料時,排序就變得更加有趣了,讀者可以自己動手試一試。

繼續閱讀