6

私はオブジェクトの配列を持っています。各オブジェクトにはidParentIdプロパティがあります (ツリーに配置できます)。それらは特定の順序ではありません。

idparentIdは整数ではなく、文字列になることに注意してください(サンプル コードをよりクリーンにしたかっただけです..)

ルートは 1 つだけです: そのid:1 としましょう。データは次のようになります。

 data = [
   {
        id:"id-2",
        parentId:"id-3"
    },
    {
        id:"id-4",
        parentId:"2"
    },
    {
        id:"id-3",
        parentId:"id-4"
    },
    {
        id:"id-5",
        parentId:"id-4"
    },
    {
        id:"id-6",
        parentId:"id-1"
    },
    {
        id:"id-7",
        parentId:"id-1"
    }
    // and so on...
]

levelネストされたレベルを指定するプロパティを各オブジェクトに与える効率的な方法を探しています...

次に、次のようになります。

data = [
    {
        id:"id-2",
        parentId:"id-1",
        level:2
    },
    {
        id:"id-3",
        parentId:"id-4",
        level:5

    },
    {
        id:"id-4",
        parentId:"id-2",
        level:3

    },
    {
        id:"id-5",
        parentId:"id-4",
        level:5
    },
    {
        id:"id-6",
        parentId:"id-1",
        level:2

    },
    {
        id:"id-7",
        parentId:"id-3",
        level:4
    }
    // and so on...
]

要するに:

level配列をループして階層を把握することで、動的に追加したい..

さらに、(可能であれば)それらはその順序に従ってソートする必要があります。たとえばlevel:3、同じ親からのすべてのオブジェクトが互いに隣り合っている必要があります。隣り合ったレベル3のいとこ2人。

4

4 に答える 4

2

どこで値を取得するのかわからないのでlevel、単なる整数であると仮定します。ところで、ループすることで配列の各項目に level プロパティを追加できます。

for (var i = 0, l = data.length; i < l; i++) { 
    data[i].level = i
}

与えるだろう

data = [{id:"1", parentId:"3", level:0 }, {id:"2", parentId:"1", level:1 } ...]
于 2013-01-03T04:14:22.323 に答える
1

再帰を必要とせずにこれに対処する 1 つの方法は、DOM 階層を作成することです。配列内の各アイテムに対して、div を作成し、それをその親にアタッチします。次に、DOM をウォークし、レベルを割り当てます (一番上がレベル 1 で、子ごとに 1 を追加します)。

ここで大まかなデモをセットアップしました: http://jsfiddle.net/4AqgM/

コードからの抜粋:

top.dataset.level="1";
var topChildren=top.getElementsByTagName("div");
for (var i=0;i<topChildren.length;i++) {
topChildren[i].dataset.level=parseInt(topChildren[i].parentNode.dataset.level)+1;
}
于 2013-01-03T18:30:02.090 に答える