[英]Sorting nested array of objects with dynamic key
我正在尝试创建一种排序功能,该功能对对象的嵌套数组进行排序,同时动态地提供键(具有不同的深度)。
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
循环。 目的是使该函数与“名称”,“名称。第一”和“名称。第一。另一个”一起使用(例如)。 有没有办法动态地做到这一点?
换句话说,我想对不同的数组使用相同的函数。 因此,对于一个数组,我想对其进行排序,调用sortByKey(array1,'name'),对另一个sortByKey(array2,'location.address')进行排序,并可能对第三个sortByKey(array3,'location.address.postalcode')进行排序像那样。
提取属性提取功能
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));
})
}
我认为您的意思是这样的:
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;
});
};
您的问题是作业被滥用,应该在此处进行比较。
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);
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);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.