如何在树布局中删除单个子节点

时间:2013-02-12 18:26:13

标签: d3.js

这是为了网球抽奖,我需要能够再见,所以大多数父母都有两个孩子,即。每场比赛的胜利者都会通过,但在某些情况下会有一个再见,因此只有一个孩子。请参阅此处的示例,其中一些父匹配没有子项,有些匹配一个:http://www.irtpa.com/index.php/realtennis/ladder/1246

我不认为这个答案会有所帮助:How to remove node on tree layout D3.js?

因为它假设隐藏/删除节点的所有子节点。

基于上面的stackoverflow答案,我已经得到了这个,但我的大脑无法看到删除/隐藏孩子的解决方案:

function check_children(data, parent) {
// recurse through array and toggle/hide any Match Byes

  if (typeof data.data != "undefined") {
    if (data.data.bye == "byeM") {
        toggle(parent);
    }
  }

  if (data.children) {
    check_children(data.children[0], data);
    check_children(data.children[1], data);
  }

}

function toggle(d) {
    if (d.children) {
        d._children = d.children;
        d.children = null;
    } else {
        d.children = d._children;
        d._children = null;
    }
}

1 个答案:

答案 0 :(得分:0)

如果你想删除你的“再见”孩子,我可能会在递归前测试。如下所示:

function removeByeChildren(parent) {
  if(!parent.children)
    return;

  var i = 0;
  while(i < parent.children.length) {
    var data = parent.children[i].data;
    if (typeof data != "undefined" && data.bye == "byeM") {
      // remove child - could save it in _children if you wanted to ever put it back
      var child = parent.children.splice(i,1);
      // length of child list reduced, i points to the next child
    }
    else {
      // not a bye - recurse
      removeByeChildren(parent.children[i]);
      // all the child's bye's are removed so go to the next child
      i++;
    }
  }
}

你可以玩它here。这个想法是检查每个孩子是否是再见。如果它是我们从列表中删除它,如果它不是我们递归并删除所有后代子孙。