D3 でネストを行っていますが、ネストされた要素では、親のデータ オブジェクトに到達する必要があります。
今、私はやっています
d3.select(this).node().parentNode.__data__;
より良い方法はありますか?
D3 でネストを行っていますが、ネストされた要素では、親のデータ オブジェクトに到達する必要があります。
今、私はやっています
d3.select(this).node().parentNode.__data__;
より良い方法はありますか?
d3.select(this).node()
this
D3セレクションに渡された関数のコンテキストと同じです。このように作り直してd3.select(this.parentNode).datum()
、醜い二重下線プロパティを使用せずに正しい値を取得できます。
私がよく知っているもう 1 つの方法は.each()
、親で使用し、クロージャ内で子を処理することです。
d3.selectAll('.parent').each(function(parentDatum) {
d3.select(this).selectAll('.child').each(function(childDatum) {
// do stuff with parentDatum and childDatum here
});
});
まったく同じ問題が発生したときに、この投稿を見つけました。私の解決策は、子に必要なデータを渡すように選択を変更することでした。ノードでデータの冗長性を維持できる場合、これは有効なアプローチであると思います。
[
{
title: "Google",
link: "www.google.com",
languagePath : "en,fr,it"
},
...
]
説明を助けるために、2 つの列を持つテーブルのコンテキストでこれを使用しました。最初の列には がtitle
あり、2 番目の列にはa
各accept-language
項目の があります。
そのため、分割のサブセレクションを行い、呼び出しlanguagePath
ごとに、テキストを言語として を作成しました。enter
a
したがって、この時点link
で、a
要素が次のようになるように も必要です。
<a href="www.google.com/en">EN</a>
<a href="www.google.com/fr">FR</a>
しかし、link
これはこの子に渡されるデータの一部ではないため、次の代わりに選択を行った場合:
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
})
})
そのため、この選択を処理data
しているときenter()
、親のデータがあります。
これがあなたの何人かにとって有効な代替手段であることを願っています、それは私を助けました.