【问题标题】:How to recursively toggle nodes in a d3.js tree diagram如何递归切换 d3.js 树图中的节点
【发布时间】: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


【解决方案1】:

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

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

【讨论】:

  • 啊……我想你明白了!这更有意义。我的简单测试可以很好地重复解决方案。今天下午晚些时候,我将用一个复杂的示例对其进行测试,并确保我正确理解了逻辑。那我会接受答案的。最高职位 FernOfTheAndes。
  • 完美!感谢 FernOfTheAndes。这完全符合我的要求。
  • 优秀 :) 很高兴能帮上忙。
猜你喜欢
  • 2012-12-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-21
  • 1970-01-01
  • 1970-01-01
  • 2016-03-08
  • 2021-10-03
相关资源
最近更新 更多