javascript - orderBy 未按预期工作

标签 javascript arrays angularjs sorting

我正在尝试迭代 JSON 响应并按对象中的另一个键值对(订单对象值,但看起来现在对我来说很有效。

我可以用我目前无法想到的另一种方式重新格式化该对象吗?

我可以在 Angular 中做些什么吗?

HTML

<div ng-app="myApp" ng-controller="Ctrl">
    <div ng-repeat="item in myCards">
        <h1>Title: {{item.title}}</h1>

        <div ng-repeat="(blockName, majorBlock) in item.blocks | orderBy:'order'">
            <h2>Name: {{blockName}}, Order: {{majorBlock.order}}</h2>
        </div>

    </div>
</div>

JS

angular.module('myApp', [])
    .controller('Ctrl', function($scope) {
        $scope.myCards =  {
            template: {
                tagline: 'Tagline',
                url: 'url',
                title: 'My Title',
                blocks: {
                    'cover': {
                        "coverUrl": "http://www.url.com/cover/",
                        "coverImage": "http://www.url.com/cover/",
                        "order": '1'
                    },
                    'text': {
                        "headerText": "amet anim est eu enim in incididunt cillum reprehenderit proident",
                        "order": '2'
                    },
                    'products_block': {
                        'order': '3'

                    }

                }
            }
        };
    });

fiddle :http://jsfiddle.net/fvdb3d3p/

我使用 orderByArray 插件尝试了一些技巧,但它们破坏了循环的其余部分。

最佳答案

问题是 $scope.myCards.template.blocks 是一个对象,而不是 Array,您可以使用 ng-repeat< 迭代对象,但过滤器 orderby 仅适用于数组,如 API 文档中所示:https://docs.angularjs.org/api/ng/filter/orderBy

您可能想为此编写一个自定义过滤器。

编辑:

我发现这个名为“orderObjectBy”的自定义过滤器来自:http://justinklemm.com/angularjs-filter-ordering-objects-ngrepeat/

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

编辑:

我调整了原始过滤器函数,以便您可以访问对象的key,调整后的版本如下所示:

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

示例:http://jsfiddle.net/fvdb3d3p/2/

关于javascript - orderBy 未按预期工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25705475/

相关文章:

javascript - 向 Node.js 发送数据并从 Node.js 获取数据?

javascript - 在 Backbone 和 Handlebars 中渲染简单按钮 View

javascript - AngularJS 从模块加载作用域函数

javascript - Meteor 将 _proto_ 添加到数组中

javascript - Angular ng 注释不适用于 babel

javascript - Bootstrap 4 - 嵌套导航链接仅在第一次打开选项卡内容

c# - 如何在 C# 中获取两个字符串数组之间的差异?

javascript - 未捕获的类型错误 : Cannot read property 'toUpperCase' of undefined

angularjs - 如何使用 MEAN 和sails.js 开始一个新项目

mysql - 为 MYSQL DB 构建 AngularJS UI。尝试添加显示另一个表中总计的列