2

親の上を歩いて子を並べ替える階層オブジェクトがあります。これは機能します。しかし今、私はオプションで階層を壊し、新しい仮想拘束を作成する必要があります。

これを説明するために、 x人の妻を持つ男性の例を見てみましょう。それぞれの妻と一緒に、彼にはy人の子供がいます。子供を妻ごとに、または妻を男性ごとに並べ替えることができます。

Man01   Wife01a     Kid01aA
                    Kid01aB
        Wife01b     Kid01bC
                    Kid01bD
Man02   Wife02c     Kid02cE
                    Kid02cF
        Wife02d     Kid02dG
                    Kid02dH

それらに名前を付けましょう:

Murphy  Winnie  Kurt
                Kara
        Wendy   Klaus
                Klea
Marley  Wonda   Kasper
                Kyra
        Wilma   Kevin
                Karla

そして、それらを親の中でアルファベット順にソートすることを考えてください。

Marley  Wilma   Karla
                Kevin
        Wonda   Kasper
                Kyra
Murphy  Wendy   Klaus
                Klea
        Winnie  Kara
                Kurt

しかし今、私たちは男性に属する子供、または一般的に妻、または一般的に子供を分類できるようにしたいですか?

Marley  Wilma   Karla
        Wonda   Kasper
        Wilma   Kevin
        Wonda   Kyra
Murphy  Winnie  Kara
        Wendy   Klaus
        Wendy   Klea
        Winnie  Kurt

これは非常に単純化された架空のオブジェクトです。実際には、アルファベット順に並べ替える代わりに、多くの多くのプロパティに対して複数列の並べ替えを行います。

結果をテーブルに出力することは問題ありませんが、処理自体にはすでに多くの時間とメモリが必要です。これ以上複雑にしたくありません。

それが問題ではない場合は、オブジェクトを配列内のテーブルとしてフラット化し、すべての複数列の並べ替えをスーパー複数列の並べ替えにチェーンし、ループがそのまま残っている最も近い共通の祖先から再グループ化します。

しかし、私は、オブジェクトを本格的なテーブル配列に変換することなく、より効率的な方法でこれを解決しようとしています。

  • どうすればこれをタックルできますか?実際にそれらのすべてを2回ループしますか?
    • おそらく、私がまだ知らないこの種のソートのための「よく知られた」解決策がありますか?
    • たぶん、すべての「仮想」親の参照を使用してテーブルのようなレコードを作成し、後でこれらの参照をループせずに階層にグループ化するウィザードを利用できますか?

これが私が参照している種類のオブジェクトの例です。つまり、オブジェクトには複数のメンバーがある場合、オブジェクトの配列が含まれていますが、Object文字通りです。{}[]{}

{
    "men"   : [
        {
            "name"  : "Murphy",
            // a lot of properties
            "wifes" : [
                {
                    "name"  : "Winnie",
                    // a lot of properties
                    "kids"  : [
                        {
                            "name"  : "Kurt",
                            // a lot of properties
                        }, {}, {} // etc...
                    ]
                }, {}, {} // etc...
            ]
        }, {}, {} // etc...
    ]
}

この場合、男性、妻、子供はすべて人間であるため、私の例は間違っていることに注意してください。しかし実際には、異なるプロパティを持つ異なるオブジェクトがあります。複数の宇宙があると仮定して、私は宇宙、惑星、土壌などを選ぶべきでした。;)

4

1 に答える 1

0

男性に属する子供を分類できるようにしたい

次に、次のように配置します。

Marley  Karla   Wilma   
        Kasper  Wonda
        Kevin   Wilma
        Kyra    Wonda
Murphy  Kara    Winnie
        Klaus   Wendy
        Klea    Wendy
        Kurt    Winnie

もちろん、子供1人あたりの母親は1人だけなので、大きな違いはありませんが、実際のデータでは異なる場合があります。

kidsそれでも、人ごとに各配列を並べ替えるだけでよいことがすでにわかります。

したがって、一般に、大きなテーブル配列にフラット化し、それを複数列で並べ替え、提案したように結果を再グループ化する代わりに、最初にグループ化を行い、後でグループを並べ替える必要があります-バケットソートのように。

var men = data["men"];
men.forEach(function (man) {
    var kids = {};
    var wifes = man["wifes"];
    for (var i=0; i<wifes.length; i++) {
        var wkids = wifes[i]["kids"];
        for (j=0; j<wkids.length; j++) {
            var id = wkids[j]["name"];
            if (id in kids) {
                kids[id].mothers.push(wifes[i]);
            else {
                kids[id] = wkids[i];
                kids[id].mothers = [ wifes[i] ];
            }
        }
    }
    // if the id is the sort criteria:
    man["kids"] = Object.keys(kids).sort().map(function(id) {
        return kids[id];
    });
    // else build the array first and then sort it:
    // man["kids"] = Object.values(kids).sort(function(kida, kidb) {
    //    <some kid comparison>
    // });

    // you might integrate this loop in the above, but it's independent:
    man["kids"].forEach(function(kid) {
        kid["mothers"].sort( /* some mother comparison */ );
    })
});
// now every man has a sorted "kids" array with each kid having a sorted "mothers" array
于 2013-02-07T14:32:46.820 に答える