0

以下のようなJavaScriptの変数があります。

var treeNode = [{
    "id": "T1"
  }, {
    "id": "T2",
    "children": [{
        "id": "T3"
      }, {
        "id": "T4"
      }, {
        "id": "T5",
        "children": [{
            "id": "T6"
          }, {
            "id": "T7"
          }, {
            "id": "T8"
          }
        ]
      }, {
        "id": "T9"
      }, {
        "id": "T10"
      }
    ]
  }, {
    "id": "T11"
  }, {
    "id": "T12"
  }
];

ノード t3、t4、t5、t6、t7、t8、t9、t10 は、ノード t2 の子です。

各ノードには非アクティブ化のリンクがあります。非アクティブ化をクリックすると、2 つのリンクがアクティブになり、作成が削除されます。画像に記載されています。

ここに画像の説明を入力

親ノードのすべての子ノードに同じアクティブおよび削除リンクを作成したい。たとえば、T5 の非アクティブ化リンクをクリックすると、T6、T7、T8 にもアクティブおよび削除リンクが表示され、T2 の非アクティブ化リンクをクリックすると次に、アクティブおよび削除リンクが T3、T4、T5、T6、T7、T8、T9、T10 にも表示されます

以下の再帰コードを試しましたが、これは正しいアプローチではないと思います。アドバイスをお願いします。

var objTreeNode = eval(treeNode);
trav(objTreeNode);

function trav(TreeNodeObj){
    var i=0;
    for (i=0;i<TreeNodeObj.length;i++){
        if(!TreeNodeObj[i].children){
            if(objID==TreeNodeObj[i].id(){ //if click on T2 then get T2 as objID
                document.getElementById('span_'+objID).innerHTML = '<a href="javascript:activate(\'' + objID + '\');">Activate</a>    <a href="javascript:deleteNode(\'' + objID
                Delete</a>';
            }
        }
        else{

            childObj = TreeNodeObj[i].children;

            trav(objTreeNode)
        }
    }

}
4

2 に答える 2

0

トラバーサル コードが間違っています。基本的なトラバーサルは次のようになります。

function trav(obj) {
    // do something with obj

    //traverse through the children and call trav for each child
    if (obj.children) {
        for (i = 0; i < obj.children.length; i++) {
            trav(obj.children[i])
        }
    }

}

アイテムの非アクティブ化中に、そのすべての子も非アクティブ化する必要があると想定しています。その場合は、次のようなものを試してください

var treeMap = {};
for (i = 0; i < TreeNodeObj.length; i++) {
    var obj = TreeNodeObj[i];
    treeMap[obj.id] = obj;
}

function deactivate(obj) {
    if (typeof obj == 'string') {
        obj = treeMap[obj];
    }
    document.getElementById('span_' + obj.id).innerHTML = '<a href="javascript:activate(\''
            + obj.id
            + '\');">Activate</a>    <a href="javascript:deleteNode(\''
            + obj.id + 'Delete</a>';

    if (obj.children) {
        for (i = 0; i < obj.children.length; i++) {
            deactivate(obj.children[i])
        }
    }
}
于 2013-04-10T06:06:29.867 に答える
0

再帰コードは次のようになります。

function trav(node) {

    var i;

    //deactivate target node
    console.log('Deactivating node id: '+node.id);

    //do the same to it's children
    if(node.children){
        for(i=0;i<node.children.length;i++){
          trav(node.children[i]);  
        } 
    }

}

console.log('Kill T1');
trav(objTreeNode[0]); //T1

console.log('Kill T2');
trav(objTreeNode[1]); //T2

console.log('Kill T5');
trav(objTreeNode[1].children[2]); //T5

非アクティブ化を示す操作でのconsole.log一部を交換するだけです。travこのサンプルは、コンソールでターゲットにされた正しいノードを示しています ( を押しますF12) 。

于 2013-04-10T06:06:47.013 に答える