通过其nth-grand-child对数组进行排序

时间:2014-06-26 09:36:42

标签: arrays angularjs sorting

我想扩展此函数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.astats.some.other.things.a ...)

任何指导如何进行?

1 个答案:

答案 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;
}