2016-06-01 146 views
2

我有一个对象,我使用的是ng-repeat,但需要显示可排序的合成项中的项目 如果多个项目的总值与排序的总值相同,应对总值进行排序应该根据p1的值来完成,如果p1与p2相同,并且如果p2也相同,那么p3.i已经基于总值排序了对象,但是仍然优先考虑如何基于多个对象属性进行排序?基于多个属性根据优先级排序javascript对象

我已经做了基础的价值和重点排序上,但需要帮助的这种复杂的情况

{ "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" 
     } 

    } 
+0

请发表评论,如果你要投票做 –

+0

,所以你需要用它应用数组排序? –

+0

是的,同样的数组我要去迭代 –

回答

2

你可以让一个数组,然后再排序它Array#sort()与想要的那种层次的回调。

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);

+1

这和我想要的完全一样 –

1

无法排序对象,但你可以用Object.keys()创建对象键的排列和排序它

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)

然后你就可以使用该键的排序数组的排序返回对象值订购

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]) });

+0

你可以尝试http://eloquentjavascript.net/和https://developer.mozilla.org/en-US/docs/Web/JavaScript –