¿Alguien puede explicar la diferencia entre datum () y data () en D3.js? Veo que ambos se usan y no estoy seguro de por qué debería elegir uno sobre el otro.
javascript
d3.js
josephmisiti
fuente
fuente
enter()
, d3 vinculará el resto de elementos de matriz con elementos SVG recién creados.Después de analizar esto un poco, descubrí que las respuestas aquí en SO no están completas, ya que solo cubren el caso cuando se invoca
selection.data
yselection.datum
con undata
parámetro de entrada . Incluso en ese escenario, los dos se comportan de manera diferente si la selección es un elemento único en comparación con cuando contiene múltiples elementos. Además, ambos métodos también pueden invocarse sin ningún argumento de entrada para consultar los datos / datos vinculados en la selección, en cuyo caso una vez más se comportan de manera diferente y devuelven cosas diferentes.Editar: publiqué una respuesta un poco más detallada a esta pregunta aquí , pero la publicación a continuación captura prácticamente todos los puntos clave con respecto a los dos métodos y cómo se diferencian entre sí.
Al suministrar
data
como argumento de entradaselection.data(data)
intentará realizar una unión de datos entre los elementos de ladata
matriz con la selección resultante en la creación deenter()
,exit()
y lasupdate()
selecciones en las que puede operar posteriormente. El resultado final de esto es que si pasa una matrizdata = [1,2,3]
, se intenta unir cada elemento de datos individual (es decir, dato) con la selección. Cada elemento de la selección solo tendrá un único elemento de referenciadata
vinculado.selection.datum(data)
evita el proceso de unión de datos por completo. Esto simplemente asigna la totalidad dedata
todos los elementos en la selección como un todo sin dividirlo como en el caso de las uniones de datos. Entonces, si desea vincular una matriz completadata = [1, 2, 3]
a cada elemento DOM en suselection
, entoncesselection.datum(data)
lo logrará.Cuando no se proporciona
data
argumento de entradaselection.data()
tomará el dato enlazado para cada elemento en la selección y los combinará en una matriz que se devuelve. Por lo tanto, siselection
incluye 3 elementos DOM con los datos"a"
,"b"
y está"c"
vinculado a cada uno respectivamente,selection.data()
regresa["a", "b", "c"]
. Es importante tener en cuenta que siselection
es un elemento único con (a modo de ejemplo) el dato"a"
unido a él, entoncesselection.data()
volverá["a"]
y no"a"
como algunos podrían esperar.selection.datum()
solo tiene sentido para una sola selección, ya que se define como devolver el dato vinculado al primer elemento de la selección. Entonces, en el ejemplo anterior, la selección consiste en elementos DOM con datos vinculados de"a"
,"b"
y"c"
,selection.datum()
simplemente regresaría"a"
.Esperemos que esto ayude a aclarar cómo
selection.data
yselection.datum()
diferir entre sí tanto al proporcionar datos como argumento de entrada como al consultar el dato enlazado al no proporcionar ningún argumento de entrada.PD: la mejor manera de entender cómo funciona esto es comenzar con un documento HTML en blanco en Chrome y abrir la consola e intentar agregar algunos elementos al documento y luego comenzar a vincular datos usando
selection.data
yselection.datum
. A veces, es mucho más fácil "asimilar" algo haciendo que leyendo.fuente
Aquí hay algunos buenos enlaces:
Buena discusión sobre D3 "data ()": comprender cómo D3.js une datos a nodos
D3 para simples mortales
Wiki D3 de Mike Bostock
Por lo último:
fuente
Creo que la explicación dada por HamsterHuey es la mejor hasta ahora. Para ampliarlo y dar una representación visual de las diferencias, creé un documento de muestra que ilustra al menos parte de las diferencias entre
data
ydatum
.La respuesta a continuación es más una opinión derivada del uso de estos métodos, pero estoy feliz de que me corrijan si me equivoco.
Este ejemplo se puede ejecutar a continuación o en este Fiddle .
Creo que
datum
es más fácil de entender, ya que no se une, pero, por supuesto, esto también significa que tiene diferentes casos de uso.Para mí, una gran diferencia, aunque hay más, es el hecho de que
data
es la forma natural de hacer actualizaciones (en vivo) en un gráfico d3, ya que todo el patrón de entrada / actualización / salida lo hace simple, una vez que lo obtiene.datum
Por otro lado, me parece más adecuado para las representaciones estáticas. En el ejemplo a continuación, por ejemplo, podría lograr el mismo resultado de mi bucle en la matriz original y acceder a los datos por índice de la siguiente manera:Pruébelo aquí: https://jsfiddle.net/gleezer/e4m6j2d8/6/
Nuevamente, creo que esto es mucho más fácil de entender ya que te mantienes libre de la carga mental que proviene del patrón de entrada / actualización / salida, pero tan pronto como necesites actualizar o cambiar la selección, seguramente será mejor que recurras a ella
.data()
.fuente