D3 datum与数据有什么不同?

有人可以解释D3.js中的datum()和data()之间的区别吗? 我看到两个都在使用,我不知道为什么你应该select一个呢?

我在这里find了Mike自己的正确答案:

D3 – 如何处理JSON数据结构?

如果要将数据绑定到单个SVG元素,请使用

(...).data([data]) 

要么

 (...).datum(data) 

如果你想将你的数据绑定到多个SVG元素

 (...).data(data).enter().append("svg") 

…..

这里有一些很好的链接:

  • 讨论D3“data()”: 了解D3.js如何将数据绑定到节点

  • D3为单纯的凡人

  • 迈克·博斯托克的维基

根据后者:

# selection.data([values[, key]])

使用当前select连接指定的数据数组。 指定的值是数据值的数组,例如数字或对象数组,或者返回值数组的函数。

# selection.datum([value])

获取或设置每个选定元素的绑定数据。 与selection.data方法不同,此方法不计算连接(因此不计算进入和退出select)。

在仔细研究了一下之后,我发现在SO上的答案并不完整,因为它们只是在您使用inputdata参数调用selection.dataselection.datum的情况下。 即使在这种情况下,如果select是单个元素还是包含多个元素,那么这两者的行为就会有所不同。 而且,这两种方法也可以在没有任何input参数的情况下被调用,以便查询select中的绑定数据/数据,在这种情况下,它们再次performance不同并返回不同的东西。

编辑 – 我在这里发布了一个稍微更详细的回答这个问题,但下面的post非常捕捉关于这两个方法的所有关键点,以及它们如何彼此不同。

当提供 data作为input参数

  • selection.data(data)将尝试执行data数组元素与select之间的数据连接,导致创buildenter()exit()update()选项,随后可以对其进行操作。 这样做的最终结果是,如果传入一个数组data = [1,2,3] ,则尝试将每个单独的数据元素(即datum)与所选内容连接起来。 select的每个元素将只有一个数据元素绑定到它。

  • selection.datum(data)完全绕过数据连接过程。 这只是将整个data全部分配给整个select中的所有元素,而不会像数据连接一样分裂。 所以如果你想要将整个数组data = [1, 2, 3]绑定到你selection每个DOM元素,那么selection.datum(data)就可以达到这个目的。

警告:许多人认为selection.datum(data)等价于selection.data([data])但只有当selection 包含单个元素时才是如此。 如果selection包含多个DOM元素,那么selection.datum(data)将把整个data绑定到select中的每个元素。 相比之下, selection.data([data])仅将整个data绑定到selection的第一个元素。 这与selection.data的数据连接行为一致。

不提供datainput参数时

  • selection.data()将获取selection.data()中每个元素的绑定数据,并将它们组合到一个返回的数组中。 因此,如果您的selection包含3个分别与数据"a""b""c"绑定的DOM元素, selection.data()将返回["a", "b", "c"] 。 重要的是要注意,如果selection是一个单一元素(举例来说)绑定的数据"a" ,那么selection.data()将返回["a"]而不是某些人所期望的"a"

  • selection.datum()仅对单个select有意义,因为它被定义为返回绑定到select的第一个元素的数据。 所以在上面的例子中,select由绑定数据为"a""b""c"的DOM元素组成, selection.datum()只返回"a"

请注意,即使selection有单个元素, selection.datum()selection.data()也会返回不同的值。 前者返回select的绑定数据(上例中的"a" ),后者返回数组中的绑定数据(上例中的["a"] )。

希望这有助于说明在提供数据作为input参数时以及在通过不提供任何input参数来查询绑定数据时, selection.dataselection.datum()如何相互区别。

PS – 理解这种工作方式的最好方法是从Chrome中的空白HTML文档开始,打开控制台并尝试向文档添加一些元素,然后使用selection.dataselection.datum开始绑定数据。 有时候,做某事比做阅读要容易得多。