JS array sorting grouping

I have an array of objects with two properties: Name and Hours.

For instance:

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

For example, in my array, I would like the sorting result to have Andy with the most hours at the beginning, then Andy with a little less hours, and then Greg, because his name comes later in alphabetical order, etc. etc.

Since the array.sort () function passes two array elements for comparison, I understand that this is not a way to go for me, but not come up with an elegant solution. Please help me.

+4
source share
4 answers

 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) 

If javascript had a spaceship operator that would be even more elegant. Note that this code is easy to extend to use more properties:

 ary.sort(function(a, b) { return cmp(a.name, b.name) || cmp(a.age, b.age) || cmp(b.hours, a.hours) || .... }) 
+12
source
 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"]); 
+3
source

You can sort by name, and then sort by items that have the same name by time.

Example:

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

All Articles