通过作为字符串传递的“grand.child.property”对对象数组进行排序的函数

时间:2014-06-29 13:29:25

标签: javascript arrays sorting

我看过all the solutions that only go 1 level deep,但我想制作一个通用的解决方案,我可以通过哪些函数来传递要比较的内部属性,例如

var array = [
    {grand: {child: {property: 2}}},
    {grand: {child: {property: 1}}},
    {grand: {child: {property: 3}}},
];

var sorted = array.sortBy('grand.child.property');

就像这样,通常将'dot.property.notation'作为字符串传递。

但我无法通过Array.sort' comparator function找到解决方法。

Array.prototype.sortBy = function(predicate){
    return this.sort(function(a, b){
        // how to get a[.grand.child.property] from the 
        // parameter string 'grand.child.property'?
    });
};

1 个答案:

答案 0 :(得分:1)

function getPropertyByPath(obj, path) {
    return path.split('.').reduce(function (val, key) { return val[key]; }, obj);
}

array.sort(function (a, b) {
    var property = 'grand.child.property';
    return getPropertyByPath(a, property) - getPropertyByPath(b, property);
});

这可以/应该使我的一些记忆技术更有效,以避免重复调用getPropertyByPath,但我希望它能说明这个想法。