1. 程式人生 > >根據物件中某一屬性進行升序降序排序的javascript實現

根據物件中某一屬性進行升序降序排序的javascript實現

背景知識:
sort() 方法用於對陣列的元素進行排序,並返回陣列。預設排序順序是根據字串Unicode碼點。
語法:arrayObject.sort(sortby);引數sortby可選。規定排序順序。必須是函式。
注:如果呼叫該方法時沒有使用引數,將按字母順序對陣列中的元素進行排序,說得更精確點,是按照字元編碼的順序進行排序。要實現這一點,首先應把陣列的元素都轉換成字串(如有必要),以便進行比較。
這裡sort是按照字元碼比較的,這樣就會導致一個問題,對一個數組排序

var arr = [1,2,10,11,3];
console.log(arr.sort());// 結果是[1,10,11,2,3]

如果想按照其他標準進行排序,就需要提供比較函式,該函式要比較兩個值,然後返回一個用於說明這兩個值的相對順序的數字。比較函式應該具有兩個引數 a 和 b,若想執行升序排序,其返回值如下:
若 a 小於 b,在排序後的陣列中 a 應該出現在 b 之前,則返回一個小於 0 的值。
若 a 等於 b,則返回 0。
若 a 大於 b,則返回一個大於 0 的值。
示例程式碼段:

if(a < b) {
    return -1;
}else if(a > b) {
    return 1;
}else {
    return 0;
}

這裡也可以用三目運算子簡寫為:

return
a < b ? -1 : 1;

再簡單一點可以寫為:

return a - b;

同樣,降序排序原理同上。

下面是屬性排序程式碼實現:

function pcompare(prop,rev) {
    // 第二個引數沒有傳遞,預設升序排序
    if(rev === undefined) {
        rev = 1;
    }else {
        rev = rev ? 1: -1;
    }
    return function(obj1,obj2) {
        // 方括號也是訪問物件屬性的一種方式,優點是可以通過變數訪問。
        // 常規寫法是 var val1 = obj1.prop;var val2 = obj2.prop;,但是這種不支援變數寫法,所有這裡不適用
var val1 = obj1[prop], val2 = obj2[prop]; // 若是升序排序,此時rev=1,rev*-1=-1,等價於return val1 < val2 ? -1 : 1,,即val1<val2時,val1放在val2前面,否則放後面 // 若是降序排序,下面句子等價於return val1 < val2 ? 1 : -1,即val1<val2時,val1放在val2後面,否則放在val2前面 return val1 < val2 ? rev*(-1) : rev*1; } } var data = [{ name: "CCC", age: 12 }, { name: "EEE", age: 3 }, { name: "AAA", age: 7 }]; // 這裡變數要加"" // 姓名按字串編碼降序排序 data.sort(pcompare("name",false)); console.log(data);

結果輸出:
這裡寫圖片描述

若是按照age排序:

data.sort(pcompare("age",false));
console.log(data);

結果輸出:
這裡寫圖片描述