配列の1つの並べ替えに基づいて並列並べ替えを実行する場合は、現在のインデックスの各オブジェクトの対応するプロパティを保持するオブジェクトの配列を作成できます。次に、通常のオブジェクトの配列のように並べ替えて、結果を元に戻します。
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];
}
});
以下のコメントに記載されているように、これは特定の最適化のために失敗する可能性があります。
配列の1つの並べ替えに基づいて並列並べ替えを実行する場合は、メインの配列を並べ替えて結果をキャッシュし、残りの配列で結果を並べ替えて再生する並べ替えヘルパーを作成できます。 。
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
。