2011-06-02 329 views
6

乾草,我有一個對象數組,我需要按每個對象的某個屬性對它們進行排序(DESC或ASC)。通過對象屬性對對象的javascript數組排序

這裏的數據

obj1 = new Object; 
obj1.date = 1307010000; 

obj2 = new Object; 
obj2.date = 1306923600; 

obj3 = new Object; 
obj3.date = 1298974800; 

obj4 = new Object; 
obj4.date = 1306923600; 

obj5 = new Object; 
obj5.date = 1307096400; 

data = [obj1,obj2,obj3,obj4,obj5]; 

現在,我要對數據進行排序數組,這樣的對象是按日期。

有人可以幫助我嗎?

回答

32

使用數組sort()方法

data.sort(function(a, b){ 
    return a.date - b.date; 
}); 
4

試試這個:

data.sort(function(a,b){ 
    return a.date - b.date; //to reverse b.date-a.date 
}); 
1

您可以使用自定義排序功能:

function mySort(a,b) { 
    return (a.date - b.date); 
} 
data.sort(mySort); 
3

該解決方案適用於任何類型的數據:

sort_array_by = function(field, reverse, pr){ 
    reverse = (reverse) ? -1 : 1; 
    return function(a,b){ 
    a = a[field]; 
    b = b[field]; 
    if (typeof(pr) != 'undefined'){ 
     a = pr(a); 
     b = pr(b); 
    } 
    if (a<b) return reverse * -1; 
    if (a>b) return reverse * 1; 
    return 0; 
    } 
} 

然後,使用這樣的(排序反向):

data.sort(sort_array_by('date', true, function(a){ 
    return new Date(a); 
})); 

作爲另一示例,可以通過類型「整數」的屬性進行排序它:

data.sort(sort_array_by('my_int_property', true, function(a){ 
    return parseInt(a); 
})); 
0

這是一個例子我如何使用排序在這裏升序排列對象數組「數組」是一個腳本標籤的object.copy糊的陣列,並瞭解通過控制檯的工作...

function OBJECT(){ 
    this.PROPERTY1 =Math.floor(Math.random()*10+1) ; 


} 

OBJECT.prototype.getPROPERTY1=function(){ 
    return(this.PROPERTY1); 
} 
OBJECT.prototype.setPROPERTY1=function (PROPERTY){ 
    this.PROPERTY1=PROPERTY; 
} 

var array= new Array(); 
console.log("unsorted object") 
for(var a=0;a<10;a++) 
{ 
array.push(new OBJECT()); 
console.log(array[a].getPROPERTY1()) 
} 


function sorting() { 
    for(var i in array){ 
     array[i].setPROPERTY1((array[i].getPROPERTY1()*1)) 
      //that is just for sorting an integer value escape this line if not an          
      //integer property 
    } 

    var arr=new(Array); 
    var temp1=new(Array); 
    for(var i in array){ 
     temp1.push(array[i]); 
    } 
    var temporary=new(Array) 
    for(var i in array) 
    { 
     var temp = array[i].getPROPERTY1(); 
     arr.push(temp); 
    } 
    arr.sort(function(a,b){return a-b}); 
    //the argument above is very important 

    console.log(arr) 
    for(var i in arr){ 

     for(var j in temp1) 
      if(arr[i]==temp1[j].getPROPERTY1()) 
       break; 

     temporary.push(temp1[j]) 


     temp1.splice(j,1)//just this statement works for me 

    } 
    array.length=0; 
    for(var i in temporary) 
    { 
     array.push(temporary[i]) 
    } 



} 


    sorting(); 
     console.log("sorted object") 
for(var a=0;a<10;a++) 
{ 
      console.log(array[a].getPROPERTY1()) 
} 
0

我添加了這個答案,因爲我看到這個線程在標記重複時被引用,並且現在有一些更新和更乾淨的解決方案可用。

另一種解決方案是使用實用程序庫,如Lodash並使用它的Collection#sortBy函數。它生成非常乾淨的代碼並提供更多功能的編程風格,從而減少錯誤。在一瞥中,它變得清楚代碼是什麼意圖。

OP的問題能夠簡單地加以解決的:

var sortedObjs = _.sortBy(data, 'date'); 

更多信息?例如。我們有如下嵌套的對象:

var users = [ 
  { 'user': {'name':'fred', 'age': 48}}, 
  { 'user': {'name':'barney', 'age': 36 }}, 
  { 'user': {'name':'fred'}}, 
  { 'user': {'name':'barney', 'age': 21}} 
]; 

我們現在可以使用_.property速記user.age指定的路徑應該匹配的屬性。我們將用嵌套的age屬性對用戶對象進行排序。是的,它允許嵌套的屬性匹配!

var sortedObjs = _.sortBy(users, ['user.age']); 

想要改變它?沒問題。使用_.reverse

var sortedObjs = _.reverse(_.sortBy(users, ['user.age'])); 

想要結合使用兩個使用Chaining而不是?

var sortedObjs = _.chain(users).sortBy('user.age').reverse().value(); 
相關問題