5

Name と Hours の 2 つのプロパティを持つオブジェクトの配列があります。

例えば:

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

たとえば、私の配列では、並べ替えの結果として、最初に最も時間が長いアンディ、次に少し時間が短いアンディ、次に名前がアルファベット順に来るためグレッグなどを取得したいと考えています。

array.sort() 関数は配列の 2 つの要素を渡して比較するため、これは私には向いていませんが、洗練された解決策を思い付くことができませんでした。私を助けてください。

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 に答える