[英]Javascript sort an object with parallel arrays
如果我有一个带有并行数组的对象:
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()
算法调用时,它将实际排序函数的结果记录到Array中。
然后,我们要做的只是简单地创建另一个函数,该函数作为辅助数组的排序函数传递。 该函数除了读取原始排序的结果外什么也不做,从而导致相同的排序发生。
您可以在代码中像这样使用它...
演示: 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;
});
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.