如果我有一个带有并行数组的对象:
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;});
但这不起作用。这显然是错误的。请帮忙。谢谢你。
如果我有一个带有并行数组的对象:
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
。
您无法对“对象”进行排序。对于上面的示例,它无法排序。除非您想对对象中的每个数组进行排序,否则可以这样做
// loop through each item in your dataset
for (var i in data) {
// make sure the item is actually part of dataset and not in herited
if (data.hasOwnProperty(i)) {
// sort:
data[i].sort(function(a,b) {
return a-b;
});
}
}