¿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.datayselection.datumcon undatapará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
datacomo argumento de entradaselection.data(data)intentará realizar una unión de datos entre los elementos de ladatamatriz 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 referenciadatavinculado.selection.datum(data)evita el proceso de unión de datos por completo. Esto simplemente asigna la totalidad dedatatodos 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
dataargumento 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, siselectionincluye 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 siselectiones 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.datayselection.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.datayselection.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
dataydatum.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
datumes 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
dataes 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.datumPor 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