Quelqu'un peut-il expliquer la différence entre datum () et data () dans D3.js? Je vois que les deux sont utilisés et je ne sais pas pourquoi vous devriez choisir l'un plutôt que l'autre?
javascript
d3.js
josephmisiti
la source
la source
enter()
, d3 liera le reste des éléments du tableau avec les éléments SVG nouvellement créés.Après y avoir examiné un peu, j'ai trouvé que les réponses ici sur SO ne sont pas complètes car elles ne couvrent le cas que lorsque vous invoquez
selection.data
etselection.datum
avec undata
paramètre d' entrée . Même dans ce scénario, les deux se comportent différemment si la sélection est un seul élément par rapport à lorsqu'elle contient plusieurs éléments. De plus, ces deux méthodes peuvent également être appelées sans aucun argument d'entrée afin d'interroger les données / données liées dans la sélection, auquel cas elles se comportent à nouveau différemment et renvoient des choses différentes.Edit - J'ai posté une réponse un peu plus détaillée à cette question ici , mais le post ci-dessous capture à peu près tous les points clés concernant les deux méthodes et comment ils diffèrent l'un de l'autre.
Lors de la fourniture
data
comme argument d'entréeselection.data(data)
tentera d'effectuer une données jonction entre les éléments dudata
tableau avec la sélection aboutissant à la création deenter()
,exit()
et lesupdate()
sélections que vous pouvez ensuite opérer. Le résultat final de ceci est que si vous passez dans un tableaudata = [1,2,3]
, une tentative est faite pour joindre chaque élément de données individuel (c'est-à-dire la donnée) avec la sélection. Chaque élément de la sélection ne seradata
lié qu'à un seul élément de référence .selection.datum(data)
contourne complètement le processus de jointure de données. Cela affecte simplement l'intégralité dedata
tous les éléments de la sélection dans son ensemble sans la diviser comme dans le cas des jointures de données. Donc, si vous souhaitez lier un tableau entierdata = [1, 2, 3]
à chaque élément DOM de votreselection
, celaselection.datum(data)
sera possible.Lorsque vous ne fournissez aucun
data
argument d'entréeselection.data()
prendra la donnée liée pour chaque élément de la sélection et les combinera dans un tableau qui est retourné. Donc, si votreselection
comprend 3 éléments DOM avec les données"a"
,"b"
et"c"
lié à chacun respectivement desselection.data()
rendements["a", "b", "c"]
. Il est important de noter que siselection
est un élément unique avec (à titre d'exemple) la donnée qui lui est"a"
liée, alorsselection.data()
reviendra["a"]
et pas"a"
comme certains peuvent s'y attendre.selection.datum()
n'a de sens que pour une seule sélection car elle est définie comme renvoyant la donnée liée au premier élément de la sélection. Donc, dans l'exemple ci-dessus avec la sélection composée d'éléments DOM avec la donnée liée de"a"
,"b"
et"c"
,selection.datum()
reviendrait simplement"a"
.Espérons que cela aide à clarifier les différences
selection.data
et à lesselection.datum()
différencier à la fois lors de la fourniture de données en tant qu'argument d'entrée et lors de l'interrogation de la donnée liée en ne fournissant aucun argument d'entrée.PS - La meilleure façon de comprendre comment cela fonctionne est de commencer avec un document HTML vierge dans Chrome et d'ouvrir la console et d'essayer d'ajouter quelques éléments au document, puis de commencer à lier les données à l'aide de
selection.data
etselection.datum
. Parfois, il est beaucoup plus facile de "grogner" quelque chose en faisant qu'en lisant.la source
Voici quelques bons liens:
Bonne discussion sur D3 "data ()": Comprendre comment D3.js lie les données aux nœuds
D3 pour les simples mortels
Wiki D3 de Mike Bostock
Selon ce dernier:
la source
Je pense que l'explication donnée par HamsterHuey est la meilleure jusqu'à présent. Pour le développer et donner une représentation visuelle des différences, j'ai créé un exemple de document qui illustre au moins une partie des différences entre
data
etdatum
.La réponse ci-dessous est plus une opinion dérivée de l'utilisation de ces méthodes, mais je suis heureux d'être corrigé si je me trompe.
Cet exemple peut être exécuté en dessous ou dans ce violon .
Je pense que
datum
c'est plus simple à comprendre car il ne fait pas de jointure, mais bien sûr cela signifie également qu'il a des cas d'utilisation différents.Pour moi, une grande différence - bien qu'il y en ait plus - est le fait que
data
c'est juste la façon naturelle de faire des mises à jour (en direct) sur un graphique d3, car l'ensemble du modèle d'entrée / mise à jour / sortie le rend simple, une fois que vous l'avez obtenu.datum
en revanche me semble plus adapté aux représentations statiques. Dans l'exemple ci-dessous par exemple, je pourrais obtenir le même résultat en bouclant sur le tableau d'origine et en accédant aux données par index comme ceci:Essayez-le ici: https://jsfiddle.net/gleezer/e4m6j2d8/6/
Encore une fois, je pense que c'est beaucoup plus facile à saisir car vous vous libérez de la charge mentale provenant du modèle d'entrée / mise à jour / sortie, mais dès que vous devrez mettre à jour ou modifier la sélection, vous ferez sûrement mieux de recourir à
.data()
.la source