对JS数组进行分组排序

Grouped sorting on a JS array

本文关键字:排序 JS 数组      更新时间:2023-09-26

我有一个对象数组,它有两个属性:Name和Hours

例如:

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

例如,在我的数组中,我希望排序的结果首先是拥有最多小时的Andy,然后是拥有较少小时的Andy,然后是Greg,因为他的名字按字母顺序排在后面,依此类推。

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

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) || ....
})
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"]);
obj.sort(function(item1,item2) {
  if ( item1.Name < item2.Name )
    return -1;
  if ( item1.Name > item2.Name )
    return 1;
  return item1.Hours - item2.Hours;
});

可以按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;
    });