誰かが D3.js の datum() と data() の違いを説明できますか? 両方が使用されているようですが、なぜ一方を選択する必要があるのかわかりません。
4 に答える
ここでマイク自身から正しい答えを見つけました:
データを単一の SVG 要素にバインドする場合は、
(...).data([data])
また
(...).datum(data)
データを複数の SVG 要素にバインドする場合
(...).data(data).enter().append("svg")
.....
ここにいくつかの良いリンクがあります:
D3 "data()" に関する良い議論: D3.js がデータをノードにバインドする方法を理解する
後者について:
# selection.data([values[, key]])
指定されたデータの配列を現在の選択範囲と結合します。指定された値は、数値やオブジェクトの配列などのデータ値の配列、または値の配列を返す関数です。
...
# selection.datum([value])
選択した各要素のバインドされたデータを取得または設定します。selection.data メソッドとは異なり、このメソッドは結合を計算しません (したがって、開始選択と終了選択を計算しません)。
HamsterHuey による説明は、これまでで最高だと思います。data
それを拡張し、違いを視覚的に表現するために、との違いの少なくとも一部を示すサンプル ドキュメントを作成しましたdatum
。
以下の回答は、これらの方法を使用して得られた意見ですが、間違っている場合は修正していただければ幸いです。
この例は、以下またはこの Fiddle で実行できます。
const data = [1,2,3,4,5];
const el = d3.select('#root');
el
.append('div')
.classed('a', true)
.datum(data)
.text(d => `node => data: ${d}`);
const join= el
.selectAll('div.b')
.data(data);
join
.enter()
.append('div')
.classed('b', true)
.text((d, i) => `node-${i + 1} => data: ${d}`)
datum
ジョインをしないので分かりやすいと思いますが、もちろんこれはユースケースが違うということでもあります。
私にとって大きな違いの 1 つは、他にもありdata
ますが、d3 チャートで (ライブ) 更新を行う自然な方法であるという事実です。
datum
一方、静的表現にはより適しているように思えます。たとえば、次の例では、元の配列をループして、次のようにインデックスでデータにアクセスすると、同じ結果を得ることができます。
data.map((n, i) => {
el
.append('div')
.classed('a', true)
.datum(data)
.text(d => `node-${n} => data: ${d[i]}`);
});
ここで試してみてください: https://jsfiddle.net/gleezer/e4m6j2d8/6/
繰り返しになりますが、入力/更新/終了パターンから生じる精神的負担から解放されているため、これは把握しやすいと思いますが、選択を更新または変更する必要がある場合は、.data()
.
const data = [1,2,3,4,5];
const el = d3.select('#root');
el
.append('div')
.classed('a', true)
.datum(data)
.text(d => `node => data: ${d}`);
const join= el
.selectAll('div.b')
.data(data);
join
.enter()
.append('div')
.classed('b', true)
.text((d, i) => `node-${i + 1} => data: ${d}`)
/* Ignore all the css */
html {
font-family: arial;
}
.l {
width: 20px;
height: 20px;
display: inline-block;
vertical-align: middle;
margin: 10px 0;
}
.l-a {
background: #cf58e4;
}
.l-b {
background: #42e4e4;
}
.a {
border-bottom: 2px solid #cf58e4;
}
.b {
border-bottom: 2px solid #42e4e4;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/d3/5.6.0/d3.min.js"></script>
<div style="margin-bottom: 20px;">
<span class="l l-a"></span> .datum() <br />
<span class="l l-b"></span> .data()
</div>
<div id="root"></div>