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 的子节点。

每个节点都有一个 deactivate 的链接。当点击 deactivate 两个活动的链接并删除 create。在图片中提到:

在此处输入图像描述

我想在父节点的所有子节点上创建相同的活动和删除链接。例如,如果我单击 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 回答