D3jsのforEach
とeach
の違いは何ですか?
まず、.forEach()
はd3の一部ではなく、javascript配列のネイティブ関数です。そう、
_["a", "b", "c"].forEach(function(d, i) { console.log(d + " " + i); });
// Outputs:
a 0
b 1
c 2
_
そして、d3がページにロードされていなくても機能します。
次に、d3の.each()
はd3の選択で機能します(d3.selectAll(...)
で得られるもの)。技術的には、d3セレクションで.forEach()
を呼び出すことができます。なぜなら、舞台裏では、d3セレクションは追加の関数を持つ配列です(そのうちの1つは.each()
)。しかし、あなたはそれをするべきではありません:
これを行うと、目的の動作が得られません。必要な動作を生成するためにd3選択で.forEach()
を使用する方法を知るには、d3の内部の仕組みを詳しく理解する必要があります。 APIの文書化された公開部分だけを使用できるのであれば、なぜそうするのでしょうか。
D3の選択で.each(function(d, i) { })
を呼び出すと、d
とi
だけでなく、関数が呼び出され、this
キーワードが内部のどこかにあるようになります。その関数は、d
に関連付けられたHTML DOM要素を指します。言い換えれば、console.log(this)
の中からfunction(d,i) {}
は_<div class="foo"></div>
_のようなものか、それがどんなhtml要素でも記録します。 CSSプロパティ、コンテンツなどを変更するために、このthis
オブジェクトの関数を呼び出すことができるため、これは便利です。通常、d3.select(this).style('color', '#c33');
のように、d3を使用してこれらのプロパティを設定します。
主なポイントは、.each()
を使用すると、d
、this
、およびi
の3つの必要なものにアクセスできることです。 .forEach()
を使用すると、配列(最初の例のように)で2つのもの(d
とi
)しか取得できず、また、HTML要素をこれらの2つのものに関連付ける作業の束。そして、それがとりわけd3の有用性です。