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

Sorting javascript objects in array by properties (angularjs filter)

本文关键字:对象 angularjs 过滤器 javascript 属性 排序 数组      更新时间:2023-09-26

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

到目前为止,我已经从这个线程中提供的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;
            }
        }
    });

非常直接,看看这个: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"}}];