【问题标题】:Sorting a JSON response in Angular by keys在 Angular 中按键对 JSON 响应进行排序
【发布时间】:2014-11-15 03:46:23
【问题描述】:

好的,我已经在这个问题上停留了一段时间,找不到合适的解决方案。基本上,我已经按服务器端的日期对帖子进行了分组,并且我想按 Angular 中的递减日期对组进行排序。我假设自定义过滤器是可行的方法,但我无法让它工作。

以下是部分代码:

JSON 响应:

{"September 20th":[{"id":5,"title":"Test 1","url":"www.google.com","tagline":"Test tagline 1","created_at":"2014-09-20T19:30:44.672Z","updated_at":"2014-09-20T19:30:44.672Z","vote_count":5}],"September 21st":[{"id":6,"title":"Test 2","url":"www.google.com","tagline":"Test tagline 2","created_at":"2014-09-21T00:00:00.000Z","updated_at":"2014-09-20T19:32:41.409Z","vote_count":8}]}

HTML:

<section ng-controller='MainController'>
    <ul ng-repeat="(date, posts) in postList | filter?">
        <h1>{{ date }}</h1>
        <li ng-repeat='post in posts'>
            <p>{{ post.vote_count }}</p>
            <button ng-click='upvote(post)' ng-disabled='!currentUser || hasVoted(post.id)'></button>
            <a href="{{ post.url }}">{{ post.title }}</a>
        </li>
    </ul>  
</section>

这可以完美地显示信息,只是日期顺序不正确。

感谢您能给我的任何帮助!

【问题讨论】:

  • 这里不需要过滤器,你只需要reverse你要绑定的数组。
  • 响应是 JSON 对象,是否可以反转?
  • JSON 是 JavaScript Object Notation 的缩写。它的主要功能是它是有效的JavaScript。 AngularJS 适用于 actual JS 对象,而不是字符串或其他任何东西。所以是的,$http.get 或任何你用来获取数据的东西都知道它需要将响应转换为 JavaScript 对象。虽然它是一个对象,而不是一个数组,所以你不能简单地反转它。
  • 是的,我不需要过滤器吗?
  • 你不能用 easy 的方式来修复服务器发送的响应吗?

标签: javascript json angularjs


【解决方案1】:

这有点 hacky,但它确实有效:

Example

HTML:

<section ng-controller='MainController'>
<ul ng-repeat="posts in postList | orderObjectBy:'created_at':true">
    <h1>{{ posts.__originalKey }}</h1>
    <li ng-repeat='post in posts'>
        <p>{{ post.vote_count }}</p>
        <button ng-click='upvote(post)' ng-disabled='!currentUser || hasVoted(post.id)'></button>
        <a href="{{ post.url }}">{{ post.title }}</a>
    </li>
</ul>  
</section>

自定义过滤器:

.filter('orderObjectBy', function() {
  return function(items, field, reverse) {
    var filtered = [];
    angular.forEach(items, function(item, key) {
      item.__originalKey=key;
      filtered.push(item);
    });
    filtered.sort(function (a, b) {
      return (a[field] > b[field] ? 1 : -1);
    });
    if(reverse) filtered.reverse();
    return filtered;
  };
})

【讨论】:

  • @user3826547 抱歉,我刚刚修复了一个类型
  • 我认为 orderBy 不适用于对象,仅适用于数组。
  • @user3826547 请查看我的最新更新,希望对您有用。干杯!
  • 虚幻的人,非常感谢!唯一的问题是我还得到了一个存储在数组中的 $promise 对象,该对象也在视图中呈现。你知道为什么会这样吗?
  • @user3826547 这很奇怪!您共享的代码量是不可能知道的。打开另一个解释此问题的问题,并确保共享您正在使用的服务代码以获取“postList”,我会尽力提供帮助。
猜你喜欢
  • 2018-07-05
  • 2019-05-17
  • 1970-01-01
  • 2012-11-06
  • 2014-07-16
  • 1970-01-01
  • 2016-03-06
  • 2017-12-29
  • 1970-01-01
相关资源
最近更新 更多