Reputation: 6992
I have an object, i am using ng-repeat
but need to show item in sortable formate
sorting should be done on the total value if total value is same for multiple item than sorting should be done based of there p1 value if p1 is same than p2 and if p2 is also same then p3.i have already sorted object on based of total value but stuck in priority how to sort on based on multiple object property ?.
i have done sorting on based of value and key but needed help on this complex situation
{ "QVC":{
"p1":0,
"p2":12,
"p3":12,
"total":24,
"org":"QVC"
},
"TURNER & TOWNSEND":{
"p1":12,
"p2":12,
"p3":0,
"total":24,
"org":"TURNER & TOWNSEND"
},
"EDF ENERGY":{
"p1":12,
"p2":0,
"p3":12,
"total":24,
"org":"EDF ENERGY"
},
"TOWERS WATSON":{
"p1":6,
"p2":0,
"p3":6,
"total":12,
"org":"TOWERS WATSON"
},
"VODAFONE UK LTD":{
"p1":0,
"p2":1,
"p3":0,
"total":1,
"org":"VODAFONE UK LTD"
},
"DENPLAN LTD":{
"p1":1,
"p2":0,
"p3":0,
"total":1,
"org":"DENPLAN LTD"
}
}
Upvotes: 3
Views: 1158
Reputation: 122047
You can't sort object but you can create array of object keys with Object.keys()
and sort it
var obj = {"QVC":{"p1":0,"p2":12,"p3":12,"total":24,"org":"QVC"},"TURNER & TOWNSEND":{"p1":12,"p2":12,"p3":0,"total":24,"org":"TURNER & TOWNSEND"},"EDF ENERGY":{"p1":12,"p2":0,"p3":12,"total":24,"org":"EDF ENERGY"},"TOWERS WATSON":{"p1":6,"p2":0,"p3":6,"total":12,"org":"TOWERS WATSON"},"VODAFONE UK LTD":{"p1":0,"p2":1,"p3":0,"total":1,"org":"VODAFONE UK LTD"},"DENPLAN LTD":{"p1":1,"p2":0,"p3":0,"total":1,"org":"DENPLAN LTD"}}
var sort = Object.keys(obj).sort(function(a, b) {
return obj[b].total - obj[a].total || obj[b].p1 - obj[a].p1 || obj[b].p2 - obj[a].p2 || obj[b].p3 - obj[a].p3;
})
console.log(sort)
Then you can use that sorted array of keys to return object values in sorted order
var obj = {"QVC":{"p1":0,"p2":12,"p3":12,"total":24,"org":"QVC"},"TURNER & TOWNSEND":{"p1":12,"p2":12,"p3":0,"total":24,"org":"TURNER & TOWNSEND"},"EDF ENERGY":{"p1":12,"p2":0,"p3":12,"total":24,"org":"EDF ENERGY"},"TOWERS WATSON":{"p1":6,"p2":0,"p3":6,"total":12,"org":"TOWERS WATSON"},"VODAFONE UK LTD":{"p1":0,"p2":1,"p3":0,"total":1,"org":"VODAFONE UK LTD"},"DENPLAN LTD":{"p1":1,"p2":0,"p3":0,"total":1,"org":"DENPLAN LTD"}}
var sort = Object.keys(obj).sort(function(a, b) {
return obj[b].total - obj[a].total || obj[b].p1 - obj[a].p1 || obj[b].p2 - obj[a].p2 || obj[b].p3 - obj[a].p3;
})
sort.forEach(function(e) {console.log(obj[e]) });
Upvotes: 1
Reputation: 386634
You can make an array first and then sort it with Array#sort()
and a callback with the wanted sort hierarchy.
var object = { "QVC": { "p1": 0, "p2": 12, "p3": 12, "total": 24, "org": "QVC" }, "TURNER & TOWNSEND": { "p1": 12, "p2": 12, "p3": 0, "total": 24, "org": "TURNER & TOWNSEND" }, "EDF ENERGY": { "p1": 12, "p2": 0, "p3": 12, "total": 24, "org": "EDF ENERGY" }, "TOWERS WATSON": { "p1": 6, "p2": 0, "p3": 6, "total": 12, "org": "TOWERS WATSON" }, "VODAFONE UK LTD": { "p1": 0, "p2": 1, "p3": 0, "total": 1, "org": "VODAFONE UK LTD" }, "DENPLAN LTD": { "p1": 1, "p2": 0, "p3": 0, "total": 1, "org": "DENPLAN LTD" } },
array = Object.keys(object).map(function (k) { return object[k]; });
array.sort(function (a, b) {
return a.total - b.total || a.p1 - b.p1 || a.p2 - b.p2 || a.p3 - b.p3;
});
console.log(array);
Upvotes: 3