【问题标题】:Sorting javascript objects in array by properties (angularjs filter)按属性对数组中的javascript对象进行排序(angularjs过滤器)
【发布时间】:2014-03-11 07:49:50
【问题描述】:

我正在尝试按 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;
            }

        }
    });

【问题讨论】:

  • 可以提供jsfiddle或者plunker吗?
  • 查看使用过滤器会影响性能,如果您要对 100 多个即(行数 * 列数)数据元素进行排序,那么我认为您不应该使用过滤器来处理它。而是编写一个指令,将对象重新定位在您在 ng-repeat 中使用的范围对象中
  • 来自文档:docs.angularjs.org/api/ng/filter/orderBy 有一个在对象数组上使用orderBy 过滤器的示例,并且过滤是在属性上完成的。这和你的问题有什么不同?您提到的线程是在讨论对象的排序属性......而不是对象数组。
  • @RishulMatta:我明白你的意思......我认为我的应用程序中的列表不会超过 100 多个项目,至少除了一个列表之外没有。所以我想我会使用后端为我排序列表,因为它是一个内部应用程序,所以带宽和速度不是问题。不过,您使用指令的想法听起来不错,我也会对此进行测试。
  • @TimothéeJeannin:啊,是的……我先有一个对象的对象,然后我自己把它改成了一个数组。所以现在它是一个对象数组。没有再考虑过它......我认为组织盲目......所以但嵌套属性仍然存在问题。如何迭代嵌套属性的动态深度以对数组中的对象进行排序?

标签: javascript arrays angularjs sorting object


【解决方案1】:

它非常简单,看看这个:http://jsbin.com/duzurazo/2/edit

你可以使用类似的东西

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

模型类似于

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

【讨论】:

    猜你喜欢
    • 2011-09-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-07
    • 2017-05-31
    • 1970-01-01
    相关资源
    最近更新 更多