d3 Verschachtelung auf mehrere Tasten, die mit einer Schleife
Ich bin mit d3.nest (), um eine hierarchische Objekt aus einer CSV-Datei.
Könnten Sie mir bitte helfen zu verstehen, warum der folgende code nicht funktioniert.
Ich schaffte es nicht die Verwendung der nesting-Funktion innerhalb einer Schleife, wie unten beschrieben.
Habe ich folgende CSV-Datei, übernommen aus den Beispielen auf der d3 website:
"type1","type2","type3","type4","type5","size"
"flare","analytics","cluster","AgglomerativeCluster","","3938"
"flare","analytics","cluster","CommunityStructure","","3812"
"flare","analytics","cluster","MergeEdge","","743"
"flare","analytics","graph","BetweennessCentrality","","3534"
"flare","analytics","graph","LinkDistance","","5731"
Diese grundlegenden Verschachtelung funktioniert:
data = data.entries(csv)
.key(function(d) {return d.type1; })
.key(function(d) {return d.type2; })
.key(function(d) {return d.type3; })
.entries(csv);
Ich will ein array von Werten angeben, mein Schlüssel, um Sie zu ändern dynamisch.
Dies funktioniert:
var data = d3.nest();
var nesting = ["type1","type2","type3"];
data = data.key(function(d) {return d[nesting[0]]; });
data = data.key(function(d) {return d[nesting[1]]; });
data = data.key(function(d) {return d[nesting[2]]; });
data = data.entries(csv);
Aber es funktioniert nicht mit einer Schleife...
var data = d3.nest();
for(var i=0;i<nesting.length;i++)
{
data = data.key(function(d) {return d[nesting[i]]; });
}
data = data.entries(csv);
Ich kann nicht verstehen, warum die Schleife version nicht funktioniert... Vielleicht vermisse ich etwas über die d3.nest () - Funktionen...
Außerdem würde ich gerne wissen, ob es einen Weg gibt, um "überspringen" einen nesting-level, wenn es nichts gefüllt auf dieser Ebene (dh: "Typ 5" - Ebene auf alle Zeilen aus dem Auszug oben). Wie könnte ich das tun?
Vielen Dank für das Lesen!
Du musst angemeldet sein, um einen Kommentar abzugeben.
Dies ist nicht ein problem mit der
.nest()
Betreiber, es ist ein problem mit JavaScript-Verschlüsse. Jedes mal, wenn Sie dieses Muster haben:Wirst du Probleme haben mit der Schließung. Die innere anonyme Funktion, die Sie definiert nicht eine Kopie des Wertes von
x
enthält es eine Referenz auf die äußere variablex
, die aktualisiert wird, wenn die äußere variable aktualisiert. Also am Ende der Schleife den Wert desx
im jeder einer Ihrer callback-Funktionen wird der Letzte Wert vonx
in der Schleife (im obigen codey
; in Ihrem codenesting.length
).Den D3
.nest()
Betreiber nutzt seine.key()
Argumente wie Rückrufe - Sie werden nicht ausgeführt, bis Sie den Anruf.map()
oder.entries()
. So das obige problem gilt.Gibt es verschiedene Wege, dies zu beheben; ich Neige dazu, verwenden Sie
.forEach()
statt einerfor
Schleife. Dies funktioniert nicht in älteren Browsern, aber weder wird die meisten von D3, so sind Sie wahrscheinlich sicher:Andere Möglichkeit ist die Verwendung einer separaten Funktion für callback-definition. Vorbei an der iterator-variable an eine weitere Funktion wird "fix", deren Wert, wie der Rückruf hat nun ein Verweis auf das argument der creator-Funktion, nicht auf das original
x
variable:Gibt es ein paar andere Ansätze, aber meiner Meinung nach
forEach
ist die eleganteste.key: something, values: number
statt, wenn nach deinem code mein-Blatt-Knoten (Knoten am Ende) hatkey: something, values: []
! Es muss ein Array statt der numerische Wert! Irgendwelche Ideen, wie ich bekommen kannvalues
zu der Nummer?Spät, um das Spiel, aber das ist ein Antwort zu Kommentar #2 oben von @Ciwan. Ich habe nicht genug "Ruf" zu kommentieren, also muss ich die Antwort hier:
Ergebnis
d3.nest()
ist richtig:Wenn Sie lieber haben zählen Sie die Elemente, die Sie verwenden können, d3.nest()'s rollup, etwa so:
Phoebe Bright ' s bl.ock ist der kanonische Ort, an dem lernen über d3.nest()