根據物件中某一屬性進行升序降序排序的javascript實現
阿新 • • 發佈:2018-12-25
背景知識:
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);
結果輸出: