0

以下のように3つの異なるオブジェクト/ノードがあり、3つのノードの和集合(一意のツリーリスト)であるfinalObj/ノードを形成しようとしています。

テキストまたはIDに基づいて3つのオブジェクト(ノード)を結合できるツリービューのメソッドはありますか?

First node: 

 [ { text: "TreeRoot", items: [
                                { text: "Subgroup1" },
                                { text: "Subgroup2" }   
                            ]}]

Second Node:
                 [ { text: "TreeRoot", items: [
                            { text: "Subgroup3" }   
                        ]}]


Third node:
                 [{ text: "Subgroup3",
                        items: [ {
                                text: "subgroup5",
                                items: [ {
                                        text: "subgroup6",
                                        items: [ {
                                                text: "subgroup7",
                                                items: [ {
                                                        text: "subgroup8"
                                                    }]
                                            }] }] 
                            }]}]



Final expected node (after merging):

                var finalObj= [ { text: "TreeRoot", items: [
                            { text: "Subgroup1" },
                            { text: "Subgroup2" },
                            { text: "Subgroup3",
                                items: [ {
                                        text: "subgroup5",
                                        items: [ {
                                                text: "subgroup6",
                                                items: [ {
                                                        text: "subgroup7",
                                                        items: [ {
                                                                text: "subgroup8"
                                                            }]
                                                    }] }] 
                                    }]}]}]

編集:

以下の解決策は、他のタイプのノードでは機能しません。

EXの場合:

   var node1 = [
                    { text   : "TreeRoot",
                        id:0,
                        items: [
                            { text: "Subgroup1",id:1 },
                            { text: "Subgroup2", id:2}
                        ]
                    }
                ];

            var node2 = [
                {
                    text : "TreeRoot",
                    id:0,
                    items: [
                        { text: "Subgroup3" ,
                        id:3}
                    ]
                }
            ];


            var node3 = [
                {
                    text : "TreeRoot",
                     id:0,
                    items: [
                        {
                            text : "Subgroup2",
                            id:2,
                            items: [
                                {
                                    text : "subgroup6",
                                    id:6,
                                    items: [
                                        {
                                            text : "subgroup7",
                                            id:7,
                                            items: [
                                                {
                                                    text: "subgroup8",
                                                    id:8
                                                }
                                            ]
                                        }
                                    ]
                                }
                            ]
                        }
                    ]
                }
            ];

上記の例では、最初はツリールートだけが表示されます。展開すると、subgroup1,2,3 ...だけが表示され、subgroup2を展開すると、subgroup6,7,8が表示されるはずです。

一意の親ノードと子ノードが必要です。上記の構造を使用すると、Subgroup3という名前の2つの子ノードが得られます。

4

1 に答える 1

2

treeviewKendo-UIとしてタグ付けしますが、解決するためのKendoUIインターフェイスがないため(ノードのマージに使用することはわかっています)実際にはプログラミングの問題ですが、再帰を使用して解決するのはそれほど難しくありません。

これは基本的に3つのノードです。

var node1 = [
    { text   : "TreeRoot",
        items: [
            { text: "Subgroup1" },
            { text: "Subgroup2" }
        ]
    }
];

var node2 = [
    {
        text : "TreeRoot",
        items: [
            { text: "Subgroup3" }
        ]
    }
];


var node3 = [
    {
        text : "Subgroup3",
        items: [
            {
                text : "subgroup5",
                items: [
                    {
                        text : "subgroup6",
                        items: [
                            {
                                text : "subgroup7",
                                items: [
                                    {
                                        text: "subgroup8"
                                    }
                                ]
                            }
                        ]
                    }
                ]
            }
        ]
    }
];

次の関数を使用してマージできます。

function merge(node1, node2) {
    if (node2 !== null) {
        if (node1.text === node2.text) {
            node1.items = node1.items || [];
            $.each(node2.items, function (idx2, elem2) {
                var found = false;
                // Check that elem does not exist on node1
                $.each(node1.items, function (idx1, elem1) {
                    if (!found && elem1.text === elem2.text) {
                        found = true;
                        merge(elem1, elem2);
                    }
                });
                if (!found) {
                    node1.items.push(elem2);
                }
            });
        } else {
            if (node1.items) {
                $.each(node1.items, function (idx, item) {
                    merge(item, node2);
                });
            }
        }
    }
}

これにより、最初のノードの2つのノードがマージされます。

そして、次のように呼び出す必要があります。

merge(node1[0], node2[0]);
merge(node1[0], node3[0]);

あなたのシナリオのために。

:各ノードに要素が1つしかないことを前提としています(つまりnode0、は配列ですが、要素は1つだけですnode1node2

ここで実行されているのを見てください

于 2013-01-08T23:12:49.363 に答える