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.data
和selection.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
的数据连接行为一致。
不提供data
input参数时
-
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.data
和selection.datum()
如何相互区别。
PS – 理解这种工作方式的最好方法是从Chrome中的空白HTML文档开始,打开控制台并尝试向文档添加一些元素,然后使用selection.data
和selection.datum
开始绑定数据。 有时候,做某事比做阅读要容易得多。