D3 javascriptforeachとそれぞれの違い


回答:


177

まず、これ.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(...))で動作します。技術的に.forEach()は、d3選択を呼び出すことができます。これは、舞台裏では、d3選択は追加の関数を含む配列であるためです(そのうちの1つはです.each())。しかし、次の理由でそれを行うべきではありません。

  1. これを行うと、目的の動作が生成されません。.forEach()目的の動作を生成するためにd3選択を使用する方法を知るには、d3の内部動作を深く理解する必要があります。それでは、APIの文書化された公開部分を使用できるのであれば、なぜそれを行うのでしょうか。

  2. .each(function(d, i) { })d3選択を呼び出すと、単なるものではなくdi:関数が呼び出され、thisその関数内の任意の場所のキーワードがに関連付けられたHTMLDOM要素を指すようになりますd。言い換えればconsole.log(this)、内部からは、HTML要素のfunction(d,i) {}ようなもの<div class="foo"></div>またはそれが何であれログに記録されます。そして、それは便利です。なぜならthis、CSSプロパティやコンテンツなどを変更するために、このオブジェクトで関数を呼び出すことができるからです。通常、のように、d3を使用してこれらのプロパティを設定しd3.select(this).style('color', '#c33');ます。

メインテイクアウトは使用して、ということである.each()あなたが必要とする3つの事へのアクセスを取得:dthisi。を使用.forEach()すると、配列(最初の例のように)では2つのもの(di)しか取得できず、HTML要素をこれらの2つのものに関連付けるために多くの作業を行う必要があります。そして、それは、とりわけ、d3がどのように役立つかです。


16
素晴らしい答えを書いてくれてありがとう、そしてSOでよくある不必要なスナークを含めずにそれをしてくれてありがとう...
Kevin H. Lin

1
ここで注意が必要です。「this」キーワードに異なるスコープが必要であるが、呼び出される関数にデータムが必要ない場合、selection [0] .forEach(...)はselection.eachよりもはるかに便利です。 'this'が単にDOM要素を参照する以外に意味がある場合は、親関数で 'self = this'の回避策が必要です。
sdupton 2015年

@sduptonのスコープthisは、たとえばを含む高階関数を渡す多くのd3シナリオで懸念されますselection.style("color", function(d,i) { /* here 'this' is a DOM element */ })。これが、d3クラス(d3.svg.axisたとえば)がprototypeクラスを定義するメソッドを使用しない理由の一部だと思います—への依存を回避する方法としてthis。しかしselection[0].forEach(...)、この問題をどのように回避するかはわかりません。同じ問題ではないですか?
meetamit 2015年

1
@meetamitは、各要素で呼び出される関数の後に渡される2番目の引数を使用してArray.prototype.forEachで使用するために「this」を明示的にスコープできます。オブジェクト指向ラッパーに似たものを書いている場合(私はES6クラスを使用しています)、「this」の明示的なスコープを失うことは厄介なことです。
sdupton 2015年

2
@ sdupton、cool —.forEachスコープの2番目のパラメーターを受け入れることを知りませんでしたthis.each()javascriptの.bind()メソッドを使用してd3で同じ効果を達成するために、似たようなものを使用できることに気づきました。たとえば、以下はスコープthisを設定しwindow、console.logを作成しますselection.each(function() { console.log(this); }.bind(window))
meetamit 2015年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.