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

在javascript中,對象和數組是兩種不一樣的類型,這和php中的數組概念不一樣。在javascript中,也有一些精妙的算法,用來對一些對象進行排序。我在面試迅雷的時候,也拿到一道題,當時作題的時候考慮到時間,沒有去仔細研究,回來後再讀了一些方法,就知道真正的考點在哪裏了。javascript

咱們如今有一組「學生」對象,包含「名字,年齡」等屬性,如今要求一個算法,把這些對象放在一個數組裏,能夠實現按照年齡對這些對象進行排序。php

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

那麼考點在哪裏呢?實際上在於數組對象的sort方法。html

Array.sort(fun)

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

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);

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

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

固然,這樣寫會遇到一些問題,這是咱們在明確知道要進行排序的對象數組的狀況,假若對象數組元素不存在age屬性,那就會報錯了,所以,你在撰寫本身的規則時,應該更加豐富它的規則判斷。函數

加入咱們如今不規定按照哪個屬性排序,好比除了age屬性,咱們還有學生的分數score屬性,咱們偶爾須要按照年齡排序,偶爾又須要按照score排序,但願能重複用這個算法,應該怎麼辦呢?編碼

function sortBy(field) {
    return function(a,b) {
        return a[field] - b[field];
    }
}
arr1.sort(sortBy("score"));

沒錯,核心的代碼就這麼簡單了,一些可能拋出錯誤的判斷,本身去考慮吧。在這種想法下面,咱們還能夠作一個設想:假如score相等的狀況下,咱們是否能夠按照年齡的大小排序輸出?.net

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"));

沒錯,其實也就這麼簡單,你甚至可使用argments來獲取更多的參數,用以傳入更多的字段做爲判斷條件。

 

 

轉載來自:http://www.tangshuang.net/2406.html。

幹活蠻足的。

相關文章
相關標籤/搜索