d3.jsを使用してソートアルゴリズムのビジュアリゼーションを作成しようとしています。この目的のために、半径の異なるいくつかの円を作成し、ソートアルゴリズムの作業としてそれらを1つずつ交換したいと思います。これをやろうとすると、d3の選択に関連するデータを更新した後、.data()
を使用してデータを取得しようとすると、変更されていないデータが取得されます(更新しなかったため)。この問題は、オブジェクトを追跡するのにkey
関数を使用した場合にのみ発生します。キーを使用するとd3選択の更新データを取得できません
コードが続きます。 「チェック」をクリックすると、正しい初期状態であるコンソールに[1, 3, 2]
が表示されます。 「do」をクリックすると、update
関数が呼び出され、円は新しいデータに従って位置を変更します。ただし、再度「確認」をクリックすると、[1, 3, 2]
が表示され、[3, 2, 1]
は期待どおりに表示されません。
- なぜそれがこのように振る舞うん:
ので、二つの質問がありますか?
- これを克服する、つまり選択から更新されたデータを取得する方法を教えてください。
function key(d) {
return d
}
function update(data) {
return d3.select("#picture")
.selectAll("circle")
.data(data, key)
.transition()
.attr("cx", function(d, i) {return (i+1)*50;});
}
$(function() {
d3.select("#picture")
.selectAll("circle")
.data([1, 3, 2], key)
.enter()
.append("circle")
.attr("cx", function(d, i) {return (i+1)*50;})
.attr("cy", 100)
.attr("r", function(d) {return (d+1)*10;})
.style("fill", "none")
.style("stroke", "steelblue");
$("#do_it").click(function() {
update([3, 2, 1]);
});
$("#check").click(function() {
console.log(d3.select("#picture")
.selectAll("circle").data());
});
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/d3/3.4.11/d3.min.js"></script>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<button id="check">check</button>
<button id="do_it">do</button><br/>
<svg id="picture" width=300 height=150></svg>
ありがとう!この場合、 '.data()'メソッドのようなものを使って要素の位置を取得する簡単な方法はないのは本当ですか? –
はい、位置を取得できます。このフィドルをチェックすると、 'console'に大きな円のx位置が表示されます:https://jsfiddle.net/gerardofurtado/fget7ouu/ –
良い!私は実際に 'do'と 'check'を押した後に '[3、2、1]'のような配列を取得したいと思っています。私は 'cx'やタグの中の' cx'と一緒に再構築しようとしますが、値の配列を取得する方法はまだ分かりません。 –