2011-06-02 222 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(); 
相关问题