我正在使用D3js来树形布局来呈现一些数据,这里的工作结果是:
http://jsfiddle.net/chrisloughnane/vV3Sc/
我想学习如何正确导航树中的节点。因此,例如,我可以设置一个函数,通过单击将所有节点设置为打开/关闭,或者可能具有类别索引,以便访问者可以单击year one
,并且该节点和所有子节点将设置为打开。 / p>
我已经完成了代码,我无法理解
function toggleAll(d) {
if (d.children) {
d.children.forEach(toggleAll);
toggle(d);
}
}
root.children.forEach(toggleAll);
对我来说,我使用root
调用该函数,然后如果传递的节点对children
的每个child
都有node
,我将其传递给函数名称?!如果不再有children
,即它已达到leaf
,则会将值从children
切换为_children
或反转。
当我通过每个toggleAll
时发生了什么?
答案 0 :(得分:2)
这里的关键是forEach
,这是一个原生的javascript函数。
(文件here)
此方法为数组的每个元素执行回调(toggleAll
)。
d
参数将由toggleAll
传递给forEach
函数。所以它并非来自封闭。
现在,因为toggleAll再次调用forEach
,它确实会进入树的下一级递归模式,直到d.children
为空。
答案 1 :(得分:0)
如果您不了解正在发生的事情,您是如何制作此工作代码的?
当我将它传递给toggleAll时会发生什么?
你明白这个问题中“它”的含义吗?
无论如何,你正在使用JavaScript数组(或者至少是类似数组的东西),你正在调用forEach方法,它接受一个函数并在每个元素上调用该函数。因此,当您第一次在root.children
上调用forEach时,将使用数组toggleAll
中的每个元素调用root.children
。然后,您再次(现在递归地)为任何后续子节点调用forEach。