次のような構造で SVG に埋め込まれているテーブルを生成しようとしています。
<table>
<tr>
<td></td>
<td></td>
</tr>
<tr>
<td></td>
<td></td>
</tr>
<tr>
<td></td>
<td></td>
</tr>
</table>
このようなデータセットから:
var a = ["a", 1, "b", 2, "c", 3]
タグの数はキーと値のペアの数に応じて動的になるため、この場合は 2 です。その内部には、それぞれキーと値を持つ 2 つの td の静的な数があります。
これまでのところ、次のようなことを試しました。
var tr = ele.append("svg:foreignObject")
.attr("x", 5)
.attr("y", 30)
.attr("width", 60)
.attr("height", 120)
.append("xhtml:body")
.attr("xmlns", "http://www.w3.org/1999/xhtml")
.selectAll("tr")
.data(d3.keys(a))
.enter().append("tr");
tr.selectAll("td").data(a).enter()
.append("td")
.text(function (d) { return d; } );
次のような結果になります。
<tr>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td></td>
<td></td>
<td></td>
</tr>
したがって、正しい行数ですが、tds の数が正しくありません。
編集:実行
tr.append("td").text("test");
tr.append("td").text("test2");
正しい構造になりますが、.data() 関数を使用して .data() 関数を使用してデータセットを反復処理しようとすると、もちろん 2 つの重複した tds が追加されます。
編集 2: d3.js チェーンの外側でテーブルの HTML を生成し、それを .html() として追加するだけで問題を解決しました。それを行うよりきちんとした方法はありますか?