2016-09-05 3 views
0

dynamisch Erstellen eines Array mit N Objekte aus einer JSON-Dateid3.js Time Scale-Diagramm, Array Objektwerte das Diagramm-Rendering ist nicht während statische Werte das Diagramm perfekt

var taskArray = []; 


d3.json("input.json", function(error, json) { 
     if (error) 
      return console.warn(error); 

     for (var i = 0; i < json.length; i++) { 

       //console.log(json[i][0]); 
       var tasks = []; 
       var version = json[i][1]; 
       var phase = json[i][2]; 
       var part = version + "(" + phase + ")"; 
       var name = json[i][0]; 


       taskArray[i]={ 
        "task" : part, 
        "type" : name, 
        "startTime" : json[i][3], 
        "endTime" : json[i][4] 
       }; 

//  console.log(taskArray); 
     } 

     }); 

JSON-Datei-Format übertragen:

[["abc", "abc_15.0.1", "Intital_phase", "Di Jul 26 21:00:00 2016", "Do Jul 28 09:00:00 2016"]]

Wenn ich das Array gebe Werte Statisch funktioniert es:

var taskArray = [ 

{ 
    task: "abc_15.0.1 (Intital_phase) ", 
    type: "abc", 
    startTime: "Mon Aug 01 06:00:00 2016", //year/month/day 
    endTime: "Mon Aug 01 14:00:00 2016", 
}, 
]; 

var dateFormat = d3.time.format("%a %b %e %H:%M:%S %Y"); 

var timeScale = d3.time.scale() 
     .domain([d3.min(taskArray, function(d) {return dateFormat.parse(d.startTime);}), 
       d3.max(taskArray, function(d) {return dateFormat.parse(d.endTime);})]) 
     .range([0,w]); 

Ist das Array-Objekt nicht korrekt? oder die Art, wie ich auf die Objektwerte zugreife, ist falsch, ich kann sie nicht finden.

+0

Würde es Ihnen etwas ausmachen, ein minimales, ausführbares Beispiel zu erstellen? –

Antwort

1

Der D3-Datumsparser gibt eine Zeichenfolge zurück, während Sie tatsächliche Date-Objekte übergeben möchten. Betrachten Sie das:

var timeScale = d3.time.scale() 
     .domain([d3.min(taskArray, function(d) {return new Date(d.startTime);}), 
       d3.max(taskArray, function(d) {return new Date(d.endTime);})]) 
     .range([0,w]); 

EDIT: den Grund gefunden!

Sie füllen Ihre taskArray innerhalb d3.json() und versuchen, es danach zu verwenden. Dies ist nicht möglich, da d3.json()asynchron ist. Es kehrt sofort zurück und erledigt seine Arbeit im Hintergrund. Das heißt, Sie müssen d3.json() einen zweiten Parameter übergeben: eine Callback-Funktion. Diese Funktion wird aufgerufen, wenn die angeforderte JSON-Datei geladen wurde. Lange Rede, kurzer Sinn: Verschieben Sie den gesamten Code, der auf den Daten beruht, in eine Funktion, die Sie als Callback übergeben.

+0

Aber was ist der Unterschied? Das OP verwendet eine Zeichenfolge in seinem statischen Array und nach seiner Meinung funktioniert es. –

+0

Für mich löst das das Problem mit D3 v3. D3 v4 benötigt timeFormat anstelle von time.format und scaleTime anstelle von time.scale. – elias

+0

@GerardoFurtado, ist es möglich, dass d3.json sie automatisch auf Datum umwandelt, wenn sie dem Format entsprechen? – elias

0

Ich denke, einige Kommas müssen entfernt werden. Sie benötigen nicht die eine nach dem endTime Attribut, und die unmittelbar vor dem Schließen ].

+0

Sie sind optional, aber kein Fehler. –

+1

danke für die Califying, @HubertGrzeskkiak. Ich war mir nicht sicher. – elias

+0

während statisch Werte angegeben werden, funktioniert es, kein Problem mit dem Komma, können Sie mir sagen, was das Problem ist, wenn ich die Objekte des Arrays dynamisch im obigen Beispiel erstellen –

Verwandte Themen