按对象属性对 javascript 对象数组进行排序

Posted

技术标签:

【中文标题】按对象属性对 javascript 对象数组进行排序【英文标题】:Sorted a javascript array of objects by an object property 【发布时间】:2011-09-06 22:49:27 【问题描述】:

嘿,我有一个对象数组,我需要根据每个对象的特定属性对它们进行排序(DESC 或 ASC)。

这是数据

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

现在,我想对数据数组进行排序,以便对象按日期排序。

有人可以帮我解决这个问题吗?

【问题讨论】:

【参考方案1】:

使用数组sort()方法

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

【讨论】:

【参考方案2】:

试试这个:

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

【讨论】:

【参考方案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);
));

【讨论】:

【参考方案4】:

我们有一个使用 Angular/TypeScript 的应用程序,并发现使用箭头函数在眼睛上稍微容易一些。在我们的例子中,以下代码是我们所拥有的示例:

data.sort((a, b) => a.SortOrder - b.SortOrder);

变化不大,但是当您有许多要排序的对象时,这会有所帮助。

【讨论】:

【参考方案5】:

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

function mySort(a,b) 
    return (a.date - b.date);

data.sort(mySort);

【讨论】:

【参考方案6】:

这是我如何使用按升序排序对象数组的示例,此处“数组”是对象数组。复制粘贴到脚本标签中并了解通过控制台工作...

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

【讨论】:

以上是关于按对象属性对 javascript 对象数组进行排序的主要内容,如果未能解决你的问题,请参考以下文章

javascript 按对象属性对对象数组进行排序

Javascript - 如何按 3 种不同的属性类型对对象数组进行排序? (字符串、整数、布尔值)

对JavaScript对象数组按指定属性和排序方向进行排序

按字符串属性值对对象数组进行排序

JavaScript实现对象数组按不同字段排序

JS对象数组多条件排序