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

Javascript 如何在d3.js树形图中递归切换节点,javascript,d3.js,Javascript,D3.js,我有一个树形图,其中每个节点都有一个描述节点颜色的元素(绿色或红色)。这些颜色具有层次性,即如果节点为红色,则其父节点将为红色。这个想法是颜色沿着树向上移动(我希望这是有意义的) 下图显示了一个示例树,其中(例如)Bilbo为红色表示Durin为红色,这反过来意味着2-B级为红色等 我在中的代码应该加载树数据并显示节点为红色的分支。当它击中绿色节点且其子节点为绿色时,我希望它们不会展开 例如,这是一张我希望在加载树时发生的事情的图片 但实际情况是这样的 (注意,梅里和派彭在我不希望他们扩张

我有一个树形图,其中每个节点都有一个描述节点颜色的元素(绿色或红色)。这些颜色具有层次性,即如果节点为红色,则其父节点将为红色。这个想法是颜色沿着树向上移动(我希望这是有意义的)

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

我在中的代码应该加载树数据并显示节点为红色的分支。当它击中绿色节点且其子节点为绿色时,我希望它们不会展开

例如,这是一张我希望在加载树时发生的事情的图片

但实际情况是这样的

(注意,梅里和派彭在我不希望他们扩张的时候已经扩张了,但甘道夫和萨鲁曼已经正确地崩溃了)

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

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);
(因为我看不出它有什么作用)但我不明白为什么它不起作用


非常感谢您阅读本文:-)

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

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);
    }
}

已更新。

如果状态不是绿色,您只需要递归,不是吗?如果是,如果我理解正确,子树应该被折叠?只要树以折叠状态开始,是的。这可以通过移除
If(d.status==“green”)来证明{
逻辑,然后折叠到深度1。好的,那么从折叠状态开始,然后简单地这样做是一个选项吗?当然会,但这就是我希望通过
toggleAll
函数实现的,但没有成功(我的simple版本!=你的simple:-)).啊…我想你明白了!这更有意义。我的简单测试可以很好地重复解决方案。今天下午晚些时候,我将用一个复杂的示例进行测试,确保我正确理解逻辑。到时候我会接受答案。顶级工作FernOfTheAndes。太好了!谢谢FernOfTheAndes。这正是我想要的。非常好:)很高兴你一直在帮忙。