Javascript 如何在d3.js树形图中递归切换节点
我有一个树形图,其中每个节点都有一个描述节点颜色的元素(绿色或红色)。这些颜色具有层次性,即如果节点为红色,则其父节点将为红色。这个想法是颜色沿着树向上移动(我希望这是有意义的) 下图显示了一个示例树,其中(例如)Bilbo为红色表示Durin为红色,这反过来意味着2-B级为红色等 我在中的代码应该加载树数据并显示节点为红色的分支。当它击中绿色节点且其子节点为绿色时,我希望它们不会展开 例如,这是一张我希望在加载树时发生的事情的图片 但实际情况是这样的 (注意,梅里和派彭在我不希望他们扩张的时候已经扩张了,但甘道夫和萨鲁曼已经正确地崩溃了) 我用来递归扩展相应节点的代码如下:Javascript 如何在d3.js树形图中递归切换节点,javascript,d3.js,Javascript,D3.js,我有一个树形图,其中每个节点都有一个描述节点颜色的元素(绿色或红色)。这些颜色具有层次性,即如果节点为红色,则其父节点将为红色。这个想法是颜色沿着树向上移动(我希望这是有意义的) 下图显示了一个示例树,其中(例如)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。这正是我想要的。非常好:)很高兴你一直在帮忙。