js中對一個對象數組按照對象某個屬性進行排序

javascript中對一個對象數組按照對象某個屬性進行排序

我們現在有一組“學生”對象,包含“名字,年齡,分數”等屬性,現在要求一個算法,把這些對象放在一個數組裏,可以實現按照年齡或者分數對這些對象進行排序。

var sdts = [
    {name:"小明",age:12,score:100},
    {name:"小紅",age:13,score:80},
    {name:"小花",age:11,score:90}
]

那麼考點在哪呢,實際上在於數組對象的sort方法

Array.sort(fun)

fun是一個函數,排序根據這個函數返回值來進行判斷,如果返回值小於0表示兩個元素不需要交換位置,1表示要用交互位置,0表示相等,實際上<=0等效。

sort方法有兩個注意點:

  1. 會操作原始數組,經過操作後原始數組發生變化
  2. 默認排序按照字符編碼排序,例如,我們有下面的一個例子:
var arr1 = [14,23,11,6,87,67];
arr1.sort();// [11,14,23,6,67,87] 按字符而非數值排序

想要完成值比較排序,必須傳入sort參數(函數)進行規制制定:

function sortRule(a,b) {
  return a-b; // 如果a>=b,返回自然數,不用交換位置
}
arr1.sort(sortRule);//[6, 11, 14, 23, 67, 87]

但是,如果遇到我們上面題目中一樣,每個元素並非是數組,而是對象,那應該怎麼去處理呢?其實道理是一樣的,只不過我們要在規制函數中重新編寫一個適合對象的規制:

functon sortRule(a,b) {
    return a.age - b.age;
}

上面的函數只能對age進行排序,我們再優化一下:

//這樣就能通過傳不同的參數而有選擇性的排序了
function sortBy(field) {
    return function(a,b) {
        return a[field] - b[field];
    }
}
arr1.sort(sortBy("score"));
arr1.sort(sortBy("age"));

在這種想法下面,我們還可以做一個設想:假如score相等的情況下,我們是否可以按照年齡的大小排序輸出?

function sortBy(field1,field2) {
    return function(a,b) {
        if(a.field1 == b.field1) return a.field2 - b.field2;
        return a.field1 - b.field1;
    }
}
arr1.sort(sortBy("score","age"));

沒錯,其實也就這麼簡單。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章