JavaScript之陣列排序
阿新 • • 發佈:2019-02-12
陣列中已經存在兩個重排序方法: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]
由於比較函式通過返回一個小於零、等於零或大於零的值來影響排序結果,因此減法操作就可以適當地處理所有這些情況。接下來,我們來看下包含物件的陣列排序:
如果需要按value值的大小進行升序排序呢?很簡單,只需要將排序方法變化一下即可:var objectList=[{name:"北京",value:89},{name:"上海",value:96},{name:"深圳",value:67},{name:"廣州",value:73}];
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()方法,然後再次依照前面的規則轉換返回的字串值。