5

我有一个具有两个属性的对象数组:名称和时间。

例如:

array = [
    {name: "ANDY", hours: 40 }, 
    {name: "ANDY", hours: 50 }, 
    {name: "GREG", hours: 40 },
]

例如,在我的数组中,我希望排序的结果首先是安迪的小时数最多,然后是安迪的小时数略少,然后是格雷格,因为他的名字按字母顺序排在后面,依此类推。

由于 array.sort() 函数传递数组的两个元素进行比较,我意识到这不是我要走的路,但未能提出一个优雅的解决方案。请帮帮我。

4

4 回答 4

14

array = [
    {name: "ANDY", hours: 40 }, 
    {name: "GREG", hours: 40 },
    {name: "ANDY", hours: 50 }, 
]

function cmp(x, y) {
  return x > y ? 1 : (x < y ? -1 : 0);
}


array.sort(function(a, b) {
  return cmp(a.name, b.name) || cmp(b.hours, a.hours)
})

console.log(array)

如果 javascript 有一个宇宙飞船操作符,那就更优雅了。请注意,此代码很容易扩展以使用更多属性:

ary.sort(function(a, b) {
    return cmp(a.name, b.name) || cmp(a.age, b.age) || cmp(b.hours, a.hours) || ....
})
于 2013-04-23T08:11:59.720 回答
3
var arr = [{
    name: "GREG",
    hours: "40"
}, {
    name: "ANDY",
    hours: "50"
}, {
    name: "ANDY",
    hours: "40"
}];

Array.prototype.sortOn = function(conds){
    this.sort(function(a, b){
        for(var i=0; i < conds.length; i++){
            var c = conds[i].split(" ");
            if(a[c[0]] < b[c[0]]){
                return c[1] == "asc" ? -1:1;
            }
            if(a[c[0]] > b[c[0]]){
                return c[1] == "asc" ? 1:-1;
            }
        }
        return 0;
    });
    return this;
}

arr.sortOn(["name asc", "hours dsc"]);
于 2013-04-23T08:14:09.590 回答
2

您可以按Name排序,然后按Hours对具有相同名称的元素进行排序

例子:

var array = [{"Name":"ANDY", "Hours":40},
             {"Name":"ANDY", "Hours":50},
             {"Name":"GREG", "Hours":40}];


var sortedArray = array.sort(function(a,b) {
            return (a["Name"] > b["Name"]) ? 1 : -1;
    }).sort(function(a,b) {
            if(a["Name"] == b["Name"])
                return (a["Hours"] < b["Hours"]) ? 1 : -1;
            else 
                return 0;
    });
于 2013-04-23T08:12:59.490 回答
2
obj.sort(function(item1,item2) {
  if ( item1.Name < item2.Name )
    return -1;
  if ( item1.Name > item2.Name )
    return 1;
  return item1.Hours - item2.Hours;
});
于 2013-04-23T08:13:44.160 回答