【发布时间】: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