d3.selectAll()D3 で結合されたデータのキーに対応する一意の ID を持つ既存の入力テキスト (で選択) を結合しようとしています。D3 に入力要素の ID をデータのキーに関連付けてもらいたいのですが、そうではありません。
関連付けは、DOM と配列にそれぞれ表示される順序で行われます。
これを行う方法はありますか?
d3.selectAll()D3 で結合されたデータのキーに対応する一意の ID を持つ既存の入力テキスト (で選択) を結合しようとしています。D3 に入力要素の ID をデータのキーに関連付けてもらいたいのですが、そうではありません。
関連付けは、DOM と配列にそれぞれ表示される順序で行われます。
これを行う方法はありますか?
キー関数は、データ配列の各要素 (つまり dt) と、選択した各要素 (つまり d3.selectAll(".input")) で呼び出されることに注意してください。どちらの場合も、キー関数は有効な値を返す必要があり、それらの出力値を使用して関連付けが行われます。
目標を達成するには、次の例のようにすることができます。ライブ バージョンのフィドルを参照してください: http://jsfiddle.net/2Fkjq/
ドキュメントに次のものが含まれている場合:
<div id="c"></div>
<div id="a"></div>
<div id="b"></div>
次に、これを実行します。
var data = [
{ key: "a", val: "aaa" },
{ key: "b", val: "bbb" },
{ key: "c", val: "ccc" }
];
d3.selectAll("div")
.data(data, function(d) { return (d && d.key) || d3.select(this).attr("id"); })
.text(function(d) { return d.val; });
この文書は次のようになります。
<div id="c">ccc</div>
<div id="a">aaa</div>
<div id="b">bbb</div>
キー機能が 2 つの部分で構成されていることがわかります。最初の部分は、データ配列用に設計されています。
(d && d.key)
その部分はundefined、d3 選択の要素に対して返されます。2 番目の部分は、次の要素を対象としています。
d3.select(this).attr("id")