如何获取d3.js中父节点的数据
我正在做嵌套在D3和嵌套元素,我需要达到其父母的数据对象。
现在我正在做
d3.select(this).node().parentNode.__data__;
有没有更好的办法?
在传递给D3select的函数的上下文中, d3.select(this).node()
与这个相同。 你可以像这样重新修改它d3.select(this.parentNode).datum()
并返回正确的值,而不必使用丑陋的双下划线属性。
我熟悉的另一种方法是在父对象上使用.each()
,然后在closures中处理子对象:
d3.selectAll('.parent').each(function(parentDatum) { d3.select(this).selectAll('.child').each(function(childDatum) { // do stuff with parentDatum and childDatum here }); });
我发现这个职位,当我有完全相同的问题。 我的解决scheme是更改select以传递孩子需要的数据,如果您可以在节点中处理数据冗余,那么我认为这可能是一种有效的方法。
[ { title: "Google", link: "www.google.com", languagePath : "en,fr,it" }, ... ]
为了帮助解释,我已经在一个表的上下文中用了两列。 第一列是title
,第二列是每个accept-language
项目。
所以我做了一个分支的languagePath
path的select,并为每个enter
呼叫,我会创builda
与文本是语言的一个。
所以在这一点上,我也需要link
,以便a
元素看起来像:
<a href="www.google.com/en">EN</a> <a href="www.google.com/fr">FR</a>
但是link
不是传递给这个孩子的数据的一部分,所以当我做select而不是做:
var langLinks = tableRow .append("td") .selectAll("span") .data(function(d) { return d.languagePath.split(",") })
我做了
var langLinks = tableRow .append("td") .selectAll("span") .data(function(d) { return d.languagePath.split(",").map(function(item) { return { lang : item, link : d.link }) })
所以,当我在这个select的enter()
上处理data
时,我确实有父数据。
希望这对你们中的一些人来说是一个有效的select,它对我有帮助。