1. 程式人生 > >JavaScript之陣列排序

JavaScript之陣列排序

    陣列中已經存在兩個重排序方法:reverse()和sort()。

    我們先來看下比較簡單的reverse()方法: reverse()將陣列項的順序進行反轉。

 var numList1=[1,2,3,4,5,6];
 numList1.reverse();
 console.log(numList1);//[6, 5, 4, 3, 2, 1] 

    此方法簡單明瞭,但也不夠靈活。
    接下來我們看sort()方法:sort()預設按照陣列升序排列陣列。

    sort()方法會呼叫每個陣列項的toString()轉型方法,然後比較得到的字串,以確定如何排序。

 var numList1=[1,5,25,12,20,10];
 numList1.sort();
 console.log(numList1);//[1, 10, 12, 20, 25, 5]雖然數值5小於除1以外的其他數值,但是在進行字串比較時,"5"則位於其他字串值的後面

     這種排序方法很不理想,但是sort()方法可以接受一個比較函式來自定義陣列的排序方法。
     比較函式接受兩個引數,如果第一個引數應該位於第二個之前則返回一個負數,如果兩個引數相等則返回0,如果第一個引數應該位於第二個之後則返回一個正數。

 function compare(a,b){
    if(a<b){
       return -1;
    }else if(a>b){
       return 1;
    }else{
       return 0;
    }
 }
 var numList1=[1,5,25,12,20,10];
 numList1.sort(compare);
 console.log(numList1);//[1, 5, 10, 12, 20, 25] 嗯,完美!

     我們也可以將該排序方法優化一下

    function compare(a,b){
        return a-b;
    }
    var numList1=[1,5,25,12,20,10];
    numList1.sort(compare);
    console.log(numList1);//[1, 5, 10, 12, 20, 25]

    由於比較函式通過返回一個小於零、等於零或大於零的值來影響排序結果,因此減法操作就可以適當地處理所有這些情況。接下來,我們來看下包含物件的陣列排序:

var objectList=[{name:"北京",value:89},{name:"上海",value:96},{name:"深圳",value:67},{name:"廣州",value:73}];
    如果需要按value值的大小進行升序排序呢?很簡單,只需要將排序方法變化一下即可:
    function compare(a,b){
        return a.value-b.value;
    }
    var objectList=[{name:"北京",value:89},{name:"上海",value:96},{name:"深圳",value:67},{name:"廣州",value:73}];
    objectList.sort(compare);
    console.log(objectList);//[{name:"深圳",value:67},{name:"廣州",value:73},{name:"北京",value:89},{name:"上海",value:96}]
    但是如果此時出現髒資料,比如某個項的value值為null或者為 " " 呢?
    function compare(a,b){
        return a.value-b.value;
    }
    var objectList=[{name:"北京",value:89},{name:"上海",value:96},{name:"深圳",value:67},{name:"廣州",value:null}];
    objectList.sort(compare);
    console.log(objectList);//[{name:"廣州",value:null},{name:"深圳",value:67},{name:"北京",value:89},{name:"上海",value:96}]
    這裡可以看出,在value值為null的情況下,sort在對其進行排序的時候,會呼叫函式Number()方法,先將其轉換為數值再排序。
 
 以下給出Number()函式的轉換規則:
  1.如果是Boolean值,true和false將分別轉換為1和0。
  2.如果是數字值,只是簡單的傳入和返回。
  3.如果是null值,返回0。
  4.如果是undefined,返回NaN(非數值)。
  5.如果是字串,遵循以下規則:
    a.如果字串中只包含數字(包括前面帶正號或負號的情況),則將其轉換為十進位制數值,即"1"會變成1,"123"會變成123,而"011"會變成11(前導零被忽略);
    b.如果字串中包含有效的浮點格式,如"1.1"則將其轉換為對應的浮點數值(同樣,也會忽略前導零);
    c.如果字串中包含有效的十六進位制格式,例如"0xf",則將其轉換為相同大小的十進位制整數值;
    d.如果字串是空的(不包含任何字元),則將其轉換為0;
    e.如果字串中包含除上述格式之外的字元,則將其轉換為NaN;
  6.如果是物件,則呼叫物件的valueOf()方法,然後依照前面的規則轉換返回的值。如果轉換的結果是NaN,則呼叫物件的toString()方法,然後再次依照前面的規則轉換返回的字串值。