天天看點

js 中文排序

有這樣一個需求是對一個清單中的一個中文字段進行排序,包括升序和降序。

于是我就百度一下,結果是找到了,但大多數都是Extjs。

第一,我不想因為就是想要個中文排序就要引入Extjs庫,extjs太龐大了,并且它還不是免費的。

第二,需求中的要排序的中文字段是有限,也就是字段是确定的

由于這兩點,我就想自己寫一個方法來進行中文排序。

在js中,排序的方法,也就是Array中的sort方法。

沒錯就用它了。

以下的斜體字是摘錄自js的語言參考手冊。

sort 方法

傳回一個元素已經進行了排序的 Array 對象。

​arrayobj.sort(sortfunction)​

參數

arrayObj

必選項。任意 Array 對象。

sortFunction

可選項。是用來确定元素順序的函數的名稱。如果這個參數被省略,那麼元素将按照 ASCII 字元順序進行升序排列。

說明

sort 方法将 Array 對象進行适當的排序;在執行過程中并不會建立新的 Array 對象。

如果為 sortfunction 參數提供了一個函數,那麼該函數必須傳回下列值之一:

  • 負值,如果所傳遞的第一個參數比第二個參數小。
  • 零,如果兩個參數相等。
  • 正值,如果第一個參數比第二個參數大。

以下舉一些例子,來說明以下sort方法使用。

對數字數組排序

var o = [6,2,4,5,3,1];

var l = o.sort();①

document.write(l);

輸出是1,2,3,4,5,6。

可以看得出,sort方法預設是升序。其實①中的語句等同于:

var l = o.sort(function(a,b){return a - b});

而如何将排序變成降序,其實很簡單是把①中的語句改成:

var l = o.sort(function(b,a){return a - b});      

sort方法,不止對數字能排序,對于英文,和中文都能排序,例如:

var o = [d,c,a,e,f,b];

var l = o.sort();

document.write(l);

輸出應該是,a,b,c,d,e,f;

var o = ["廣州","深圳","東莞","中山","順德","佛山"];

var l = o.sort();

document.write(l);

輸出的結果是:

東莞,中山,佛山,廣州,深圳,順德

這并不是我所想那樣子,我想的是,東莞,佛山,廣州,深圳,順德,中山。怎麼才能按照我所想排序。其實可以用對象字面量來實作。

var o = ["廣州","深圳","東莞","中山","順德","佛山"];

var compareData = {

"東莞" : 1,

"佛山" : 2,

"廣州" : 3,

"深圳" : 4,

"順德" : 5,

"中山" : 6

};

var l = o.sort(function(a,b){return compareData[a]- compareData[b]});

document.write(l);

這樣子,輸出的結果,就是

:東莞,佛山,廣州,深圳,順德,中山

然而,很多時候,數組的元素不是簡單的字元,或者數字,如果是一個json傳回的對象怎麼排序。

var o = [{id : 007, type : "廣州"}, 
     {id : 005, type : "深圳"},
     {id : 008, type : "東莞"}, 
     {id : 003, type : "中山"}, 
     {id : 002, type : "深圳"}, 
     {id : 006, type : "佛山"}];
var compareData = {
    "東莞" : 1,
    "佛山" : 2,
    "廣州" : 3,
    "深圳" : 4,
    "順德" : 5,
    "中山" : 6
};
l = o.sort(function compare(a,b){return compareData[a.type] - compareData[b.type];});
for(var i = 0; i < l.length; i++){
    document.write(l[i]["type"]);
}      

通過上面兩個例子,我們應該清楚明白,其實a,或者b,或者你定義的參數都是要排序的數組的元素。

明白這點,其實對于以後修改排序的compare函數其實簡單得多。

然而,我對于上面的例子,還是不太滿,它的擴充性比較差,如果我在中間插入“河源”的話,以後修改起來,會比較麻煩,因為,我要修改深圳,順德,中山的值,如果多起來怎麼辦,這會是個很頭疼的問題。于是,能不能用String對象中的indexof()結合substr()方法優化。

var o = [{id : 007, type : "廣州"},

{id : 005, type : "深圳"},

{id : 008, type : "東莞"},

{id : 003, type : "中山"},

{id : 002, type : "深圳"},

{id : 006, type : "佛山"}];

var compareString = "東佛廣深順中";

var l = o.sort(function compare(a,b){

return compareString.indexOf(a.type.substr(0,1)) - compareString.indexOf(b.type.substr(0,1));

});

for(var i = 0; i < l.length; i++){

document.write(l[i]["type"]);

}