Kann jemand bitte den Unterschied zwischen datum () und data () in D3.js erklären? Ich sehe beide verwendet und bin mir nicht sicher, warum Sie eine über die andere wählen sollten?
javascript
d3.js
josephmisiti
quelle
quelle
enter()
d3 den Rest der Array-Elemente mit neu erstellten SVG-Elementen bindet , falls beim Binden von Daten mehr Datenarray-Elemente als SVG-Elemente vorhanden sind .Nachdem ich mich ein wenig damit befasst habe, habe ich festgestellt, dass die Antworten hier auf SO nicht vollständig sind, da sie nur den Fall abdecken, wenn Sie aufrufen
selection.data
undselection.datum
einen Eingabeparameter verwendendata
. Selbst in diesem Szenario verhalten sich die beiden anders, wenn die Auswahl ein einzelnes Element ist, als wenn sie mehrere Elemente enthält. Darüber hinaus können beide Methoden auch ohne Eingabeargumente aufgerufen werden, um die gebundenen Daten / Daten in der Auswahl abzufragen. In diesem Fall verhalten sie sich erneut unterschiedlich und geben unterschiedliche Dinge zurück.Bearbeiten - gab ich eine etwas ausführlichere Antwort auf diese Frage hier , aber die Post unten ziemlich erfasst alle wichtigen Punkte in Bezug auf die beiden Methoden und wie sie sich voneinander unterscheiden.
Bei Angabe
data
als Eingabeargumentselection.data(data)
wird versuchen, eine Datenverbindung zwischen den Elementen desdata
Arrays mit der Auswahl durchzuführen, die zur Erstellung von führtenter()
,exit()
undupdate()
Auswahlen, mit denen Sie anschließend arbeiten können. Das Endergebnis davon ist, wenn Sie ein Array übergebendata = [1,2,3]
, wird versucht, jedes einzelne Datenelement (dh Datum) mit der Auswahl zu verbinden. An jedes Element der Auswahl ist nur ein einziges Bezugselementdata
gebunden.selection.datum(data)
Umgeht den Datenverbindungsprozess insgesamt. Dies ordnet einfach die Gesamtheitdata
aller Elemente in der Auswahl als Ganzes zu, ohne sie wie bei Datenverknüpfungen aufzuteilen. Wenn Sie also ein ganzes Arraydata = [1, 2, 3]
an jedes DOM-Element in Ihrem Element binden möchtenselection
,selection.datum(data)
wird dies erreicht.Bei Angabe kein
data
Eingabeargumentselection.data()
nimmt das gebundene Datum für jedes Element in der Auswahl und kombiniert sie zu einem Array, das zurückgegeben wird. Also, wenn Ihrselection
beinhaltet 3 DOM - Elemente mit den Daten"a"
,"b"
und"c"
an die jeweils gebundenenselection.data()
Renditen["a", "b", "c"]
. Es ist wichtig zu beachten, dass, wennselection
es sich um ein einzelnes Element handelt, an das (beispielsweise) das Datum"a"
gebunden ist, dieses zurückgegebenselection.data()
wird["a"]
und nicht"a"
wie von einigen erwartet.selection.datum()
Dies ist nur für eine einzelne Auswahl sinnvoll, da definiert wird, dass das an das erste Element der Auswahl gebundene Datum zurückgegeben wird . So in dem obigen Beispiel mit der Auswahl aus DOM - Elementen mit gebundenem Bezug von"a"
,"b"
und"c"
,selection.datum()
würde einfach zurückkehren"a"
.Hoffentlich hilft dies zu klären, wie
selection.data
undselection.datum()
sich voneinander unterscheiden, sowohl bei der Bereitstellung von Daten als Eingabeargument als auch bei der Abfrage des gebundenen Datums, indem keine Eingabeargumente angegeben werden.PS - Der beste Weg, um zu verstehen, wie dies funktioniert, besteht darin, mit einem leeren HTML-Dokument in Chrome zu beginnen, die Konsole zu öffnen und dem Dokument einige Elemente hinzuzufügen und dann mit
selection.data
und Daten zu bindenselection.datum
. Manchmal ist es viel einfacher, etwas durch Handeln zu "groken" als durch Lesen.quelle
Hier sind einige gute Links:
Gute Diskussion zu D3 "data ()": Verstehen, wie D3.js Daten an Knoten bindet
D3 für bloße Sterbliche
Mike Bostocks D3-Wiki
Per letzterem:
quelle
Ich denke, die Erklärung von HamsterHuey ist die bisher beste. Um es zu erweitern und eine visuelle Darstellung der Unterschiede zu geben, habe ich ein Beispieldokument erstellt, das zumindest einen Teil der Unterschiede zwischen
data
und veranschaulichtdatum
.Die folgende Antwort ist eher eine Meinung, die aus der Verwendung dieser Methoden abgeleitet wurde, aber ich bin froh, korrigiert zu werden, wenn ich falsch liege.
Dieses Beispiel kann unten oder in dieser Geige ausgeführt werden .
Ich denke, das
datum
ist einfacher zu verstehen, da es keinen Join macht, aber das bedeutet natürlich auch, dass es verschiedene Anwendungsfälle gibt.Für mich ist ein großer Unterschied - obwohl es noch mehr gibt - die Tatsache, dass dies
data
nur die natürliche Art ist, (Live-) Updates auf einem D3-Diagramm durchzuführen, da das gesamte Ein- / Aktualisierungs- / Ausstiegsmuster es einfach macht, sobald Sie es erhalten.datum
Andererseits scheint es mir eher für statische Darstellungen geeignet zu sein. Im folgenden Beispiel könnte ich zum Beispiel das gleiche Ergebnis erzielen, wenn ich das ursprüngliche Array durchschleife und über den Index wie folgt auf die Daten zugreife:Probieren Sie es hier aus: https://jsfiddle.net/gleezer/e4m6j2d8/6/
Auch hier denke ich, dass dies viel einfacher zu verstehen ist, da Sie sich von der mentalen Belastung durch das Ein- / Aktualisierungs- / Ausstiegsmuster befreien, aber sobald Sie die Auswahl aktualisieren oder ändern müssen, ist es sicherlich besser, auf sie zurückzugreifen
.data()
.quelle