0

並列配列を持つオブジェクトがある場合:

var obj = {};
obj['aa'] = [5,2,7,0];
obj['bb'] = ['b', 'e', 'f', 'a'];
obj['cc'] = [12, 66, 77, 43];

値の 1 つに基づいて配列を並べ替えるにはどうすればよいですか? たとえば、「aa」配列の値に基づいて 3 つの配列を並べ替えたいとします。私は試した

obj.sort(function(a, b) {return aa.a - bb.a;});

しかし、それはうまくいきません。明らかに間違っています。助けてください。ありがとうございました。

4

2 に答える 2

4

配列の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

于 2012-08-06T19:51:00.243 に答える
0

「オブジェクト」をソートすることはできません。上記の例ではソートできません。オブジェクト内の各配列を並べ替えたい場合を除き、それはそのように行われます

// 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;
        });
    }
}
于 2012-08-06T19:29:02.637 に答える