如果我有一个具有并行数组的对象:
var obj = {};
obj['aa'] = [5,2,7,0];
obj['bb'] = ['b', 'e', 'f', 'a'];
obj['cc'] = [12, 66, 77, 43];
如何根据其中一个值对数组进行排序?例如,我希望根据“aa”数组的值对三个数组进行排序。我试过了
obj.sort(function(a, b) {return aa.a - bb.a;});
但这行不通。这显然是错误的。请帮忙。谢谢。
最佳答案
如果您希望根据其中一个数组的排序进行并行排序,则可以创建一个对象数组,其中包含当前索引的每个对象的相应属性。然后像普通的对象数组一样对其进行排序并将结果转换回来。
obj.aa.map(function(_, i) {
var o = {};
for (var p in obj) {
o[p] = obj[p][i];
}
return o
}).sort(function(a,b) {
return a.aa - b.aa;
}).forEach(function(o, i) {
for (var p in obj) {
obj[p][i] = o[p];
}
});
<小时/>
如下面的评论所述,由于某些优化,这可能会失败。
如果您希望根据其中一个数组的排序进行并行排序,您可以创建一个排序助手来对主数组进行排序,并缓存结果,然后按排序回放结果在其余的数组上。
function parallel_sort(fn, arr1 /*, arr2, ..., arrn */) {
var results = [],
playback = function() {
var j = 0;
return function() {
return results[j++];
};
},
i = 0;
arr1.sort(function(a, b) {
return results[i++] = fn(a, b);
});
for (var k = 2; k < arguments.length; k++) {
arguments[k].sort(playback());
}
}
<小时/>
总体来说,这个概念非常简单。只需对第一个数组进行排序,但传递一个包装实际排序函数的函数。
当包装函数被 .sort()
算法调用时,它将实际排序函数的结果记录到数组中。
然后我们需要做的就是创建另一个函数作为辅助数组的排序函数。该函数除了读回原始排序的结果之外什么也不做,从而导致发生相同的排序。
<小时/>您可以在代码中像这样使用它......
演示: http://jsfiddle.net/jWg3n/
var obj = {};
obj['aa'] = [5,2,7,0];
obj['bb'] = ['b', 'e', 'f', 'a'];
obj['cc'] = [12, 66, 77, 43];
parallel_sort(function(a,b) { return a - b; },
obj.aa,
obj.bb,
obj.cc
);
结果看起来像这样......
{
"aa": [
0,
2,
5,
7
],
"bb": [
"a",
"e",
"b",
"f"
],
"cc": [
43,
66,
12,
77
]
}
obj.aa
是主要排序,因此 obj.bb
和 obj.cc
遵循 obj 的排序。 aa
.
关于Javascript 使用并行数组对对象进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11834536/