如何使用嵌套属性在AngularJS中排序

时间:2014-05-18 15:12:09

标签: javascript angularjs

这是使用PHP生成的json

[{"Sale":{"id":"1","customer_id":"1","amount":"15","created":"2014-05-17"}}]

执行orderBy:id显然无效。我在其他帖子中读到需要为这种数据结构创建orderBy函数。我无法创建该功能。任何人都可以告诉我解决这个问题的正确方法是什么?

3 个答案:

答案 0 :(得分:56)

假设你有:

$scope.sales = [{"Sale":{"id":"1"}},{"Sale":{"id":"2"}},{"Sale":{"id":"3"}}];

为什么不做以下事情:

<div ng-repeat="sale in sales | orderBy:'Sale.id':true">
    {{ sale.Sale.id }}
</div>

它适合我的情况。可能是Angular在你提出这个问题的时候不支持它。

答案 1 :(得分:5)

这些类型的数据操作我喜欢将它们保存在适当的角度对象中,因此我会创建自定义过滤器,例如:

var sampleSource=  [{"Sale":{"id":"8","customer_id":"1","amount":"15","created":"2014-05-17"}}, {"Sale":{"id":"5","customer_id":"6","amount":"15","created":"2015-05-17"}}];

var myApp = angular.module('myApp',[]);

myApp.filter('myFilter', function() {
 return function(items) {  
    items.sort(function(a,b){   
        if (parseInt(a.Sale.id) > parseInt(b.Sale.id))
            return 1;
        if (parseInt(a.Sale.id) < parseInt(b.Sale.id))
            return -1;         
        return 0; })
});
  

重要提示:我建议使用自定义过滤器,因为作为个人偏好,我不喜欢使用任务(代码)重载我的控制器或其他对象,我可以将其分离到其他对象上,从而使我更加独立更清洁的代码(我喜欢角度的事情之一)但除了这个个人偏好我会说这是不是唯一的方法,但如果你分享我背后的原因,我希望它有所帮助。

答案 2 :(得分:0)

myapp.filter('orderBySub', function () {
  return function (items, field, reverse) {

    byString = function(o, s) {
        s = s.replace(/\[(\w+)\]/g, '.$1');
        s = s.replace(/^\./, '');
        var a = s.split('.');
        for (var i = 0, n = a.length; i < n; ++i) {
            var k = a[i];
            if (k in o) {
                o = o[k];
            } else {
                return;
            }
        }
        return o;
    }

    items.sort(function (a, b) {
        if (byString(a, field) > byString(b, field))
            return reverse ? -1 : 1;
        if (byString(a, field) < byString(b, field))
            return reverse ? 1 : -1;
        return 0;
    })
    return items;
  }
});

示例

ng-repeat="task in tasks | orderBySub: 'field1.subfield2.subsubfield3':true"

true =反向