我正在尝试创建一个排序函数,用于对嵌套的对象数组进行排序,同时动态地给出一个键(具有不同的深度)。
sortByKey(array, key){
var splitKey = key.split(".");
if(splitKey.length = 2){
return array.sort(function(a, b) {
var x = a[splitKey[0]][splitKey[1]]; var y = b[splitKey[0]][splitKey[1]];
return ((x < y) ? -1 : ((x > y) ? 1 : 0));
});
} else {
return array.sort(function(a, b) {
var x = a[key]; var y = b[key];
return ((x < y) ? -1 : ((x > y) ? 1 : 0));
});
}
}
我想摆脱if - else
并改为使用for
循环。目标是该功能适用于&#39; name&#39;,#name; name.first&#39;并且&#39; name.first.another&#39; (举个例子)。有没有办法动态地做到这一点?
换句话说,我想对不同的数组使用相同的函数。因此,对于一个数组,我想对它进行排序,调用sortByKey(array1,&#39; name&#39;)和另一个sortByKey(array2,&#39; location.address&#39;)并且可能使用第三个sortByKey(array3, &#39; location.address.postalcode&#39;)或类似的东西。
答案 0 :(得分:2)
提取属性提取功能
function prop(key) {
var keys = key.split('.');
return keys.reduce.bind(keys, function(obj, name) {
return obj[name]
})
}
并使用它来提取值:)
sortByKey(array, key){
var getKey = prop(key);
return array.sort(function(a, b){
var x = getKey(a); var y = getKey(b);
return ((x < y) ? -1 : ((x > y) ? 1 : 0));
})
}
答案 1 :(得分:0)
我认为你的意思是这样的:
function sortByKey(array, key){
var splitKey = key.split(".");
return array.sort(function(a, b) {
var ta = a;
var tb = b;
for (var i=0; i<splitKey.length; i++) {
ta = ta[splitKey[i]];
};
/// return ((a < b) ? -1 : ((a > b) ? 1 : 0)); // Too complex ;-)
return a - b;
});
};
答案 2 :(得分:0)
你的问题是一个误用的作业,它应该是一个比较。
if (splitKey.length === 2) {
// ^^^
较短的方法可以使用Array#reduce
。
function sortByKey(array, key) {
var getValue = function (o, k) { return o[k]; },
keys = key.split(".");
return array.sort(function (a, b) {
return keys.reduce(getValue, a) - keys.reduce(getValue, b);
});
}
var array = [{ a: 5, b: { c: 2 } }, { a: 7, b: { c: 1 } }, { a: 1, b: { c: 3 } }];
sortByKey(array, 'a');
console.log(array);
sortByKey(array, 'b.c');
console.log(array);
&#13;
ES6
function sortByKey(array, key) {
var getValue = (o, k) => o[k],
keys = key.split(".");
return array.sort((a, b) => keys.reduce(getValue, a) - keys.reduce(getValue, b));
}
var array = [{ a: 5, b: { c: 2 } }, { a: 7, b: { c: 1 } }, { a: 1, b: { c: 3 } }];
sortByKey(array, 'a');
console.log(array);
sortByKey(array, 'b.c');
console.log(array);
&#13;