我有一个密钥是年的对象:
years: {
"2100": {
countingAgent: false,
turns: 3,
cards: 4,
score: 3
},
"2000": {
countingAgent: false,
turns: 4,
cards: 3,
score: 4
},
"1900": {
countingAgent: false,
turns: 5,
cards: 2,
score: 6
} ...
}
我希望高年级成为第一,我有ng-repeat
:
<li class="year" ng-repeat="(year, data) in years">
我尝试了| orderBy:'year':true"
和| orderBy:'score':true"
,但都没有效果,它始终将1900放在首位。
--- --- UPDATE
似乎所有解决方案都围绕创建过滤器将对象转换为数组来解决。有没有更优雅的解决方案?
答案 0 :(得分:1)
orderBy需要数组,而不是对象。您最好简单地转换数据。 或者实现简单的过滤器:
app.filter('keyarray', function() {
return function(object) {
var result = [];
angular.forEach(object, function(value, key) {
result.push(key);
});
return result;
}
});
在html中:
<div ng-repeat="key in test | keyarray | orderBy : '-toString()'">{{key}} : {{test[key]}}</div>
答案 1 :(得分:0)
您可以使用-years
:
<li class="year" ng-repeat="(year, data) in years | orderBy:'-years'">
数据按years
降序排序。
在你的问题中,你把&#34; orderBy:&#39; year&#39;:true&#34;但应该是&#34; orderBy:&#39;年 s &#39;:true&#34;
-------- --------- EDIT
您应该创建一个过滤器来订购您的对象:
myApp.filter('orderObjectBy', function () {
return function (input, attribute) {
if (!angular.isObject(input)) return input;
var array = [];
for (var objectKey in input) {
array.push(input[objectKey]);
input[objectKey].year = objectKey;
}
array.sort(function (a, b) {
a = parseInt(a[attribute]);
b = parseInt(b[attribute]);
return b - a;
});
console.log(array)
return array;
}
});
然后使用此过滤器命令重复:
<li ng-repeat="data in years | orderObjectBy:'position'">
{{data.year}}
{{data.countingAgent}}
{{data.turns}}
{{data.cards}}
{{data.score}}
</li>
JSFiddle:http://jsfiddle.net/ghorg12110/z4v96s4v/1/
*我的答案基于以下内容:AngularJS sorting by property并根据您的具体情况进行了一些更改。