我看过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'?
});
};
答案 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
,但我希望它能说明这个想法。