使用数字键

时间:2015-11-12 14:27:35

标签: angularjs object filter angularjs-ng-repeat ng-repeat

我有一个密钥是年的对象:

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

似乎所有解决方案都围绕创建过滤器将对象转换为数组来解决。有没有更优雅的解决方案?

2 个答案:

答案 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>

http://plnkr.co/edit/BHm4dv2np4ysUAlJFaO3?p=preview

答案 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并根据您的具体情况进行了一些更改。