【发布时间】:2019-10-16 02:57:05
【问题描述】:
我有一个树形图,其中每个节点都有一个描述节点颜色(绿色或红色)的元素。这些颜色是分层的,如果一个节点是红色的,那么它的父节点就是红色的。这个想法是颜色沿着树向上传播(我希望这是有道理的。
下图显示了一个示例树,其中(例如)Bilbo 为红色意味着 Durin 为红色,这反过来又意味着 2-B 级为红色等。
我在JSFiddle 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);
(因为它没有我能辨别的效果)但我不知道为什么它不起作用。
非常感谢您阅读本文 :-)。
【问题讨论】:
-
如果状态为 not 绿色,您只需要递归,不是吗?如果是的话,如果我理解正确的话,应该折叠子树?
-
只要树以折叠状态开始,就可以。
-
这可以通过移除
if (d.status == "green") {逻辑并折叠到深度 1 来证明。 -
好的,那么可以选择以折叠状态开始然后简单地这样做吗?
-
当然可以,但这就是我希望通过
toggleAll函数实现的目标,但没有成功(我的简单版本!= 你的简单版本 :-))。
标签: javascript d3.js