如何在d3.js中获取父节点的数据

Ahm*_*gle 46 d3.js

我在D3中嵌套,在嵌套元素中,我需要在其父级上访问数据对象.

现在我在做

d3.select(this).node().parentNode.__data__;
Run Code Online (Sandbox Code Playgroud)

有没有更好的办法?

mys*_*and 68

d3.select(this).node()this传递给D3选择的函数的上下文中的相同.您可以像这样重做它d3.select(this.parentNode).datum()并获得正确的值,而不必使用丑陋的双下划线属性.

  • 唉,这只有在父节点附加了数据的情况下才可行。如果两个节点之间有一个带有数据的中间节点(即使用完全虚构的符号的“<li data="parent"><ol><li data="child">”),则必须执行“parentNode” .parentNode`,协商 DOM 而不是数据树。 (2认同)

nra*_*itz 19

我熟悉的另一种方法是.each()在父节点上使用,然后在封闭内处理子节点:

d3.selectAll('.parent').each(function(parentDatum) {
    d3.select(this).selectAll('.child').each(function(childDatum) {
        // do stuff with parentDatum and childDatum here
    });
});
Run Code Online (Sandbox Code Playgroud)


bit*_*oiu 7

当我遇到完全相同的问题时,我发现了这篇文章.我的解决方案是更改选择以传递我将需要的数据,如果您可以使用节点中的数据冗余,我认为这可能是一种有效的方法.

[
  {
    title: "Google",
    link: "www.google.com",
    languagePath : "en,fr,it"
  },

  ...
]
Run Code Online (Sandbox Code Playgroud)

为了帮助解释,我在表的上下文中使用了这个,有两列.第一列具有title第二列,第二列具有a每个accept-language项目.

所以我做了一个子选择的分裂languagePath和每个enter调用,我会创建一个a文本作为语言.

所以在这一点上我也需要link,所以a元素看起来像:

<a href="www.google.com/en">EN</a>
<a href="www.google.com/fr">FR</a>
Run Code Online (Sandbox Code Playgroud)

但这link不是传递给这个孩子的数据的一部分,所以当我做选择而不是做:

var langLinks = tableRow
     .append("td")
     .selectAll("span")
     .data(function(d) {
        return d.languagePath.split(",")
      })
Run Code Online (Sandbox Code Playgroud)

我做到了

 var langLinks = tableRow
     .append("td")
     .selectAll("span")
     .data(function(d) {
        return d.languagePath.split(",").map(function(item) {
                 return {
                   lang : item,
                   link : d.link
               })
      })
Run Code Online (Sandbox Code Playgroud)

所以,当我处理dataenter()本次评选中我有父母的资料.

希望这对你们中的一些人来说是一个有效的选择,它确实帮助了我.