D3.js Can';单击';是否更改嵌套组的属性?

D3.js Can';单击';是否更改嵌套组的属性?,d3.js,svg,D3.js,Svg,我有一个圆圈布局图,其中许多最上面的圆圈(叶子)都有共同的标题 我想添加一个交互,当用户单击任何一个页面时,它会突出显示每个具有公共标题的页面。例如,如果这个数据集有1000片叶子,用户可以点击任何标有“CD19”的叶子,很容易看到所有其他的“CD19”叶子 我这样做是为了我自己的启发。我有一个半途而废的解决方案。如果您能为我指明正确的方向,或者解释我的解决方案不起作用,我将不胜感激 以下是我天真的解决方案: 使用d3.nest和.object按名称对叶子进行分组 const nodes = p

我有一个圆圈布局图,其中许多最上面的圆圈(叶子)都有共同的标题

我想添加一个交互,当用户单击任何一个页面时,它会突出显示每个具有公共标题的页面。例如,如果这个数据集有1000片叶子,用户可以点击任何标有“CD19”的叶子,很容易看到所有其他的“CD19”叶子

我这样做是为了我自己的启发。我有一个半途而废的解决方案。如果您能为我指明正确的方向,或者解释我的解决方案不起作用,我将不胜感激

以下是我天真的解决方案:

使用d3.nest和.object按名称对叶子进行分组

const nodes = packLayout(root).descendants()
const nameNest = d3.nest().key(d => d.data.name).object(nodes);
现在,当将名称作为键传递时,nameNest返回具有相同名称的对象数组

console.log(nameNest['CD 19']) // => Array(3)
然后使用.forEach(…)在数组的每个成员上设置公共属性

nameNest['CD 19'].forEach(item => item.r = 50)
这达到了预期的效果。所有标有“CD 19”的圆的半径均为50。但我想做的是将这段代码转换成一个函数,然后将该函数传递到我的圆圈上的事件中,如下所示:

const namez = d => nameNest[d.data.name]
                    .forEach(item => item.r = 50)
...

const circles = nodesEnter
       .append('circle')
       ...
       .on('click', d => namez(d));
这是行不通的。log(d=>namez(d))返回“未定义”

但是,当我取下.forEach(…)console.log(d=>namez(d))时,将返回与我单击的节点同名的预期对象数组。那么为什么我不能使用.forEach来修改namez(d)从.on()中返回的数组呢


这是我的代码:

您的代码正在运行!但是,您只是更改了数据,而不是实际的SVG元素

要更改圆,必须重新绘制它们。例如:

.on('click', d => {
    namez(d);
    circles.attr('r', d => d.r)
});

以下是更新的代码:

您的代码正在运行!但是,您只是更改了数据,而不是实际的SVG元素

要更改圆,必须重新绘制它们。例如:

.on('click', d => {
    namez(d);
    circles.attr('r', d => d.r)
});

以下是更新后的代码:

调试无法运行的代码非常困难。因此,请慢慢来,将JS代码和JSON数据放在这个编辑器中:(将JS放在正文底部的脚本中,将JSON作为变量,或者,因为您使用的是d3.JSON,请单击“添加新文件”)。这样我们可以更好地帮助你。谢谢杰拉尔多!我编辑了我的帖子,并在bl.ocksIt上添加了一个代码链接。调试我们无法运行的代码非常困难。因此,请慢慢来,将JS代码和JSON数据放在这个编辑器中:(将JS放在正文底部的脚本中,将JSON作为变量,或者,因为您使用的是d3.JSON,请单击“添加新文件”)。这样我们可以更好地帮助你。谢谢杰拉尔多!我编辑了我的帖子,并在bl.ocksholy cow上添加了代码链接!谢谢你,杰拉尔多。你对我的代码的修改很有效,现在我知道我遗漏了什么。我真的很感谢你的帮助——真是太棒了!谢谢你,杰拉尔多。你对我的代码的修改很有效,现在我知道我遗漏了什么。我真的很感谢你的帮助-埃弗里