首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >对ngRepeat - angularJS中的散列对象的值进行排序

对ngRepeat - angularJS中的散列对象的值进行排序
EN

Stack Overflow用户
提问于 2012-11-25 23:23:45
回答 4查看 10.9K关注 0票数 8

我有一个这样的对象:

代码语言:javascript
复制
$scope.phones = new Object();
$scope.phones['id1'] = {
    "name":"Phone Name1",
    "dateReleased":"2012-1-09 15:48:24"
};
$scope.phones['id2'] = {
    "name": "Phone Name2",
    "dateReleased":"2012-3-12 15:32:11"
};
$scope.phones['id3'] = {
    "name": "Phone Name3",
    "dateReleased":"2012-2-10 13:53:32"
};

我正在使用ngRepeat显示此内容。我无法通过dateReleased订购。此外,反向排序也不起作用。我的ngRepeat是这样的:

代码语言:javascript
复制
<li ng-repeat="phone in phones | orderBy:dateReleased:true">
    <p>{{phone.name}}</p>
    <p>{{phone.dateReleased}}</p>
</li>
EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2012-11-26 02:12:39

如果检查documentation,就会发现orderBy中的表达式可以是函数字符串数组。因此,您需要dateReleased为字符串:'dateReleased‘

此外,您需要您的电话对象是一个实际的数组。

尝试:

代码语言:javascript
复制
$scope.phones = [{
        "name":"Phone Name1",
        "dateReleased":"2012-1-09 15:48:24"
    },{
        "name": "Phone Name2",
        "dateReleased":"2012-3-12 15:32:11"
    },{
        "name": "Phone Name3",
        "dateReleased":"2012-2-10 13:53:32"
    }];

<li ng-repeat="phone in phones | orderBy:'dateReleased':true">
    <p>{{phone.name}}</p>
    <p>{{phone.dateReleased}}</p>
</li>
票数 5
EN

Stack Overflow用户

发布于 2013-09-18 03:19:08

虽然ngRepeat可以迭代散列对象,例如示例中的$scope.phones,但是内置的orderBy过滤器将不起作用。我相信这是由于对象的存储方式。正如其他人所指出的,您需要将散列转换为数组。虽然您可以使用上面建议的方法完成此操作,但我更喜欢使用自定义筛选器。这使我不必直接更改我的散列,并且让我将过滤器与其他散列一起重用。

代码语言:javascript
复制
yourApp.filter('orderObjectBy', function() {
  return function(items, field, reverse) {
    var filtered = [];
    angular.forEach(items, function(item) {
      filtered.push(item);
    });
    filtered.sort(function (a, b) {
      return (a[field] > b[field] ? 1 : -1);
    });
    if(reverse) filtered.reverse();
    return filtered;
  };
});

此过滤器将对象转换为标准数组,并按您指定的字段对其进行排序。您可以像使用orderBy一样使用orderObjectBy筛选器,在字段名后面包含一个布尔值,以指定是否应颠倒顺序。换句话说,false是上升的,true是下降的。

代码语言:javascript
复制
<li ng-repeat="phone in phones | orderObjectBy:'dateReleased':true">
  <p>{{phone.name}}</p>
  <p>{{phone.dateReleased}}</p>
</li>

我有一个关于这个话题的post on my blog

票数 12
EN

Stack Overflow用户

发布于 2012-11-27 08:10:39

其他两个答案都能帮你找到一部分,但不是全部……

您需要在您的作用域上创建一个函数,将对象转换为一个数组,如下所示:

代码语言:javascript
复制
$scope.phonesArray = function() {
    var result = [];
    angular.forEach($scope.phones, function(phone, id) {
      result.push(phone);
    });
    return result;
};

然后你会调用它,而不是你的ngRepeat中的对象:

代码语言:javascript
复制
<li ng-repeat="phone in phonesArray() | orderBy:'dateReleased':true">
    <p>{{phone.name}}</p>
    <p>{{phone.dateReleased}}</p>
</li>

另外:请注意,'dateReleased'是一个字符串,所以它知道从当前项中$eval掉该字符串,否则它将检查父$scope.dateReleased,而父off并不存在。

Here is a plunk for what I think you're trying to do

编辑:如果你担心这样做的函数太“昂贵”,你也可以将对象“转换”为数组并存储在$scope上,但这应该不是问题,因为你正在为一个用户开发客户端应用程序,而不是为许多用户开发服务器应用程序,这意味着你有一点“昂贵”的回旋余地。(无论如何都不会是这样的)

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13552387

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档