Zunächst muss die erste Zeile Ihrer CSV eine durch Kommas getrennte Liste von Spaltennamen sein, um diese Methode verwenden zu können. Wenn dies nicht möglich ist, geben Sie einen Kommentar dazu ein und ich werde sehen, ob ich herausfinden kann, wie ich es d3.csv.parseRows
anstelle von verwenden soll d3.csv.parse
. d3.csv.parse
wird von der Prüferfunktion aufgerufen .defer(function, url, assessor)
.
Ich gehe davon aus, dass Ihre Datei jetzt so aussieht:
danger.csv
iso,level
AFG,100
ALB,0
DZA,12
...
Auf diese Weise können Sie einen Nachschlage-Hash von ISO3 bis zur Gefahrenstufe erstellen.
var dangerByISO3 = d3.map();
queue()
.defer(d3.json, "url to topo.json")
.defer(d3.csv, "url to danger.csv", function(d) {dangerByISO3.set(d.iso, +d.level);})
.await(ready);
function ready(error, world) {
//You now have world as your available topojson
//And you have dangerByISO3 as your danger level hash
//You can lookup a danger level by dangerByISO3.get(ISO3 code)
}
Code-Komplettlösung
var dangerByISO3 = d3.map();
Zuerst erstellen Sie ein d3.map () -Objekt, das als Ihr Schlüssel-Hash fungiert, und speichern dieses in der Variablen dangerByISO3.
queue()
Verwenden Sie die Warteschlange zum parallelen Laden.
.defer(d3.json, "url to topo.json")
Laden Sie Ihren Topojson als erstes Argument, das an die Funktion await übergeben wird (nach einem Fehler). Beachten Sie hier den Stil, bei dem es sich um eine verkettete Funktion handelt queue()
, die jedoch in einer separaten Zeile aufgeführt ist (kein abschließendes Semikolon queue()
).
.defer(d3.csv, "url to danger.csv", function(d) {dangerByISO3.set(d.iso, +d.level);})
Hier passieren zwei Dinge. Zunächst laden Sie danger.csv als zweites Argument, das an die Funktion await übergeben werden soll. Wie Sie weiter unten sehen werden, wird dieses Argument nicht verwendet. Stattdessen wird der Ladefunktion d3.csv ein Prüferargument bereitgestellt. Dieser Prüfer verarbeitet jede Zeile der CSV. In diesem Fall rufen wir die set-Funktion auf dangerByISO3 auf, sodass wir für jede Tastenkombination iso
den level
als Wert für diesen Schlüssel festlegen . Die +d.level
Notation verwendet unary +
, um den Wert von d.level in eine Zahl umzuwandeln.
.await(ready);
Sobald beide Datenquellen geladen sind, werden sie als zwei separate Argumente an die Funktion übergeben ready()
. Das erste Argument für den Rückruf ist immer der erste aufgetretene Fehler. Wenn kein Fehler aufgetreten ist, wird null als erstes Argument übergeben. Das zweite Argument ist die erste Datenquelle (Ergebnis der ersten Aufgabe) und das dritte Argument ist die zweite Datenquelle (Ergebnis der zweiten Aufgabe).
function ready(error, world) {...}
Dies ist die Rückruffunktion ready()
. Zuerst nehmen wir das error
Argument, das null sein sollte, wenn die beiden Ladetasks erfolgreich abgeschlossen wurden (Sie sollten tatsächlich eine Sprache hinzufügen, um Fehler abzufangen und zu behandeln). Als nächstes nehmen wir die Topojson-Daten als Objekt countries
. Diese Daten sollten im Hauptteil der Funktion mit so etwas wie verarbeitet werden .data(topojson.feature(world,world.objects.countries).features)
. Da ready()
es kein drittes Argument gibt, wird das Ergebnis der zweiten Aufgabe, unser csv, einfach verworfen. Wir haben es nur verwendet, um den Schlüssel-Hash zu erstellen und brauchten ihn danach nicht mehr.