是什么区别forEach
,并each
在D3js?
Answers:
首先,.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选择是具有附加功能的数组(其中一个是.each()
)。但是您不应该这样做,因为:
这样做将不会产生所需的行为。知道如何.forEach()
与d3选择配合使用以产生任何所需的行为,需要深入了解d3的内部工作原理。那么,如果您只能使用API记录的公开部分,为什么要这样做。
当您调用.each(function(d, i) { })
d3选择时,您不仅获得了d
而且i
:,该函数被调用,使得该this
函数内任何位置的关键字都指向与关联的HTML DOM元素d
。换句话说,console.log(this)
从内部function(d,i) {}
将记录类似<div class="foo"></div>
或类似的html元素。这很有用,因为然后您可以在此this
对象上调用function ,以更改其CSS属性,内容或其他内容。通常,您可以使用d3设置这些属性,如中所示d3.select(this).style('color', '#c33');
。
主要的外卖是,使用.each()
您可以访问三件事情你需要:d
,this
和i
。使用.forEach()
,在数组上(例如从一开始的示例中),您只会得到2件事(d
和i
),并且您必须做一堆工作才能将HTML元素与这2件事相关联。尤其是d3的用途。
this
在许多d3场景中,@ sdupton作用域设置是一个问题,在这些场景中您传递了更高阶的函数,例如selection.style("color", function(d,i) { /* here 'this' is a DOM element */ })
。我认为,这就是为什么d3类(例如d3.svg.axis
,例如)不使用prototype
定义类的方法的部分原因,这是避免依赖的一种方法this
。但是我看不出如何selection[0].forEach(...)
避免这个问题。是不是同样的问题?
.forEach
接受第二个参数来进行范围界定this
。它让我意识到,您可以使用类似ish的东西,.each()
通过使用javascript来与d3达到相同的效果.bind()
方法。例如,以下内容将适用this
于window
console.log并将其记录下来:selection.each(function() { console.log(this); }.bind(window))
。