如何递归切换d3.js树形图中的节点

时间:2014-05-26 06:37:24

标签: javascript d3.js

我有一个树形图,其中每个节点都有一个描述节点颜色的元素(绿色或红色)。这些颜色是分层的,如果一个节点是红色的,那么它的父节点将是红色。这个想法是颜色在树上移动(我希望这是有道理的。

下图显示了一个示例树,其中(例如)Bilbo为红色表示Durin为红色,这反过来表示Level 2-B为红色等。

enter image description here

我在JSFiddle here中的代码应该加载树数据并显示节点为红色的那些分支。如果它打到一个绿色的节点并且有一个绿色的子节点,我希望它们 被扩展。

例如,下面是树加载时我想要发生的图片;

enter image description here

但这是实际发生的事情;

enter image description here

(请注意,当我不想要它们时,Merry和Pipen已经扩展了,但Gandalf和Saruman正确地崩溃了)

我用来递归扩展相应节点的代码如下:

root = treeData[0];
root.x0 = height / 2;
root.y0 = 0;

function toggleAll(d) {
  if (d.children) {
    if (d.status == "green") {
      d._children = d.children;
      d._children.forEach(toggleAll);
      d.children = null;
    }
  }
}

root.children.forEach(toggleAll);

我有一种感觉,我错误的地方在

      d._children.forEach(toggleAll);

(因为它没有我能辨别的效果)但我无法弄清楚为什么它不起作用。

非常感谢你阅读这篇文章:-)。

1 个答案:

答案 0 :(得分:3)

如果状态不是绿色,您仍然需要遍历树:

function toggleAll(d) {
    if (d.children) {
        if (d.status == "green") {
            d._children = d.children;
            d._children.forEach(toggleAll);
            d.children = null;
        }
        else
            d.children.forEach(toggleAll);
    }
}

更新了FIDDLE