![](/img/trans.png)
[英]Data structure or process to sort an array based on the sorting order of another
[英]Sorting an array based on the order of another
我有一个带有数据对象的数组:
[{height: '5 feet'}, {name: 'john'}, {'hair-color': 'brown'}]
另一个带有这些对象应遵循的顺序:
['name', 'height', 'hair-color']
因此,为了对第一个数组进行排序,我尝试使用sort方法,该方法一次比较两个数组元素,并根据一个标准确定哪个应该首先排序,我的是每个对象的键在第二个数组中出现的顺序。 问题在于sort方法使用的回调仅传递了两个元素,因此我无法将它们与第二个数组中的任何内容进行比较,因为它超出了回调的范围。 非常感谢您的帮助。
这是一个可以做到的功能。 我必须说您的第一个数据结构有点奇怪,因为没有简单的方法来获取第一个数组中每个对象中的键。 但是,我想出了一种时髦的方法来做到这一点,并且确实可以:
var source = [{height: '5 feet'}, {name: 'john'}, {'hair-color': 'brown'}];
var desiredOrder = ['name', 'height', 'hair-color'];
function sortBy(src, order) {
// assumes both src and order are the same length and every item in source has a
// matching item in order and there are no empty objects in src
// this is a funky function who's job it is to find the first key in the
// object. Why the OP used a data structure like this, I have no idea!
// It makes no sense to me because it's next to impossible to use in real life
function findKey(obj) {
for (var i in obj) {
if (obj.hasOwnProperty(i)) {
return(i);
}
}
}
// make an object that has each of the keys in it with the sort order as the value
var sortHash = {};
var i;
for (i = 0; i < order.length; i++) {
sortHash[order[i]] = i;
}
var result = new Array(src.length);
var key;
for (i = 0; i < src.length; i++) {
key = findKey(src[i]);
result[sortHash[key]] = src[i];
}
return(result);
}
var result = sortBy(source, desiredOrder);
您可以在这里看到它的工作: http : //jsfiddle.net/jfriend00/Y8xnY/ 。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.