我想扩展此函数AngularJS sorting by property的功能。
它基本上通过子属性对数组进行排序。但我想要的是让它更通用化,使其能够按任何指定的n-grand-child进行排序。
功能是
function orderObjectBy(input, attribute) {
if (!angular.isObject(input)) return input;
var array = [];
for(var objectKey in input) {
array.push(input[objectKey]);
}
array.sort(function(a, b){
a = parseInt(a[attribute]);
b = parseInt(b[attribute]);
return a - b;
});
return array;
}
这是一个适用于此的数组:orderObjectBy(object, 'stat_a')
array = [
{stat_a:3},
{stat_a:2},
{stat_a:5},
]
以下是我想要使用的内容:orderObjectBy(object, 'stats.a')
array = [
{stats:{a: 3}},
{stats:{a: 2}},
{stats:{a: 5}},
]
我不知道怎么做。它比较的行
a = parseInt(a[attribute]);
不能将stats.a
作为attribute
。
我也不知道如何制作parseInt(a[stats][a])
注意,stats.a
示例仅仅是.split('.').pop()
等,但我想要一种更通用的方法,它适用于stats.some.things.a
或stats.some.other.things.a
...)
任何指导如何进行?
答案 0 :(得分:1)
将属性名称拆分为“。”并使用属性名称列表探索对象。
array.sort(function(a,b) {
a = parseInt(getAttribute(a, attribute);
b = parseInt(getAttribute(b, attribute);
return a-b
})
function getAttribute(object,attribute) {
var o = object;
var attrs = attribute.split(".")
for ( var i=0; i<attrs.length; i++) {
o = o[attrs[i]];
if (o==null) {
return null;
}
}
return o;
}