按属性排序数组中的javascript对象(angularjs过滤器)

时间:2014-03-11 07:49:51

标签: javascript arrays angularjs sorting object

我正在尝试通过angularjs应用程序的属性对javascript对象数组进行排序。我需要能够按数字和字符串排序。

到目前为止,我已将this thread中提供的Armin的过滤器扩展为对数字和字符串进行排序(请参阅下面的代码)。

我仍然缺少的是能够为过滤器提供嵌套属性(如user.surname)的能力。它应该是动态的,这样我就可以为它提供任何深度的嵌套属性。有没有办法做到这一点?

这是我的过滤器代码:

angular.module('app')
    .filter('orderObjectBy', function(){
        return function(input, filterBy) {
            if (!angular.isObject(input)) return input;

            var attribute = filterBy;
            var reverse = false;

            if (filterBy.substr(0,1) == '-') {
                attribute = filterBy.substr(1);
                reverse = true;
            }

            var array = [];
            for(var objectKey in input) {
                array.push(input[objectKey]);
            }

            if (parseInt(array[0][attribute])) {
                array.sort(function(a, b){
                    a = parseInt(a[attribute]);
                    b = parseInt(b[attribute]);
                    return a - b;
                });
            } else {
                array.sort(function (a,b) {
                    if (a[attribute] < b[attribute]) {
                        return -1;
                    } else if (a[attribute] > b[attribute]) {
                        return 1;
                    } else {
                        return 0;
                    }
                });
            }

            if (reverse) {
                return array.reverse();
            } else {
                return array;
            }

        }
    });

1 个答案:

答案 0 :(得分:1)

非常直截了当地检查出来:http://jsbin.com/duzurazo/2/edit

你可以使用像

这样的东西
  <li ng-repeat="prop in props | orderBy:'order.v'"> {{prop.order.v}} </li>

其中model类似于

  $scope.props = [{order:{v:"1"}},{order:{v:"5"}},{order:{v:"2"}}];