JS中對於對象數組按照對象的某個屬性進行排序


1.對象數組

我們現在有一組對象,包含“name,value”等屬性,實現按照value對這些對象進行排序。

series:[
{name:'西安市',value:100},
{name:'威陽市',value:120},
{name:'延安市',value:80},
{name:'南洛市',value:90},
{name:'榆林市',value:130}
]

2.排序方法

實際上在於數組對象的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);

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

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

當然,這樣寫只使用對象的value屬性,這是我們在明確知道要進行排序的對象數組的情況,倘若對象數組元素不存在value屬性,那就會報錯了,因此,你在撰寫自己的規則時,應該適用其他屬性規則判斷。

假如我們現在不規定按照哪一個屬性排序,比如除了value屬性,我們還有其他的屬性,希望能重復用這個算法,應該怎么辦呢?

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

沒錯,核心的代碼就這么簡單了。在這種想法下面,我們還可以做一個設想:假如value相等的情況下,我們是否可以其他屬性的大小排序輸出?

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("value","score"));

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

 

 

 

 

參考原文:https://www.tangshuang.net/2406.html

 
        



免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM