讀古今文學網 > 編寫高質量代碼:改善JavaScript程序的188個建議 > 建議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){

return(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]


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


function f(a,b){

return-(a-b)

}

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

a.sort(f);

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


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

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


function f(a,b){

var a=a%2;

var b=b%2;

if(a==0)return 1;

if(b==0)return-1;

}

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

a.sort(f);

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


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


function f(a,b){

var a=a%2;

var b=b%2;

if(a==0)return-1;

if(b==0)return 1;

}


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

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


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

a.sort;

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


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


function f(a,b){

return(a<b);

}

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

a.sort(f);

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


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


function f(a,b){

var a=a.toLowerCase;

var b=b.toLowerCase;

if(a<b){

return 1;

}

else{

return-1;

}

}

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

a.sort(f);

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


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

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

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


function f(a,b){

if(a>Math.floor(a))return 1;

if(b>Math.floor(b))return-1;

}

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

a.sort(f);

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


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

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