2013-07-01 26 views
11

ich ein Array oder Objekte eines Datums aus und einige Werte:die Lücken in D3 Array Füllen nisten

var flatData = [ 
    { "date": "2012-05-26", "product": "apple" }, 
    { "date": "2012-07-03", "product": "orange" }, 
    ... 
] 

Ich versuche d3.nest() zu verwenden, um eine Zählung dieser Objekte von Jahr zu erhalten und dann nach Monat.

var nestedData = d3.nest() 
    .key(function(d) { return d.date.split('-')[0]; }) // key is the year 
    .sortKeys(d3.ascending) 
    .key(function(d) { 
     var splitDate = d.date.split('-'); 
     return splitDate[0] + '-' + splitDate[1]; // key is year-month 
    }) 
    .sortKeys(d3.ascending) 
    .rollup(function(d) { 
     return d.length; 
    }) 
    .entries(flatData); 

Diese fast funktioniert, mit der Ausnahme, dass, wenn es keine Objekte für einen Monat sind die verschachtelten Daten enthalten keine Aufzeichnung eine Zählung von 0 für diesen Monat angibt. Gibt es einen Trick, um D3 zu sagen, diese Lücken zu füllen?

(Natürlich kann ich es immer die mühsame Art und Weise, dh eine Schleife durch alle verschachtelten Ebenen und schaffen Struktur eine neue Daten, die in die Lücken füllt.)

+0

Was meinst du damit, die Lücken zu füllen, dh welchen Zählwert willst du zurückgeben, wenn da nichts ist? –

+1

Ich möchte, dass es ein Objekt mit der Anzahl von 0 zurückgibt. Auf diese Weise, wenn ich die Informationen verwende, um ein Balkendiagramm zu zeichnen, gibt es einen Datensatz für jeden Balken und ich kann einfach die Objekte durchlaufen. Der alternative Ansatz, an den ich gedacht habe, ist nicht, für jeden Balken eine Aufzeichnung anzunehmen und den Diagramm-Rendering-Algorithmus entsprechend anzupassen. – Naresh

+0

In D3 gibt es nichts, aber Sie können die fehlenden Werte ausfüllen, indem Sie danach die verschachtelte Struktur durchlaufen. –

Antwort

5

Versuchen das Hinzufügen der fehlenden Datenpunkte nach dem Reduktion:

var flatData = [ 
    { "date": "2012-05-26", "product": "apple" }, 
    { "date": "2012-07-03", "product": "orange" }] 

nestedData = d3.nest() 
    .key(function(d) { return d.date.split('-')[0]; }) // key is the year 
    .sortKeys(d3.ascending) 
    .key(function(d) { 
     var splitDate = d.date.split('-'); 
     return splitDate[0] + '-' + splitDate[1]; // key is year-month 
    }) 
    .sortKeys(d3.ascending) 
    .rollup(function(d) { 
     return d.length; 
    }) 
    .entries(flatData); 


yMFormat = d3.time.format('%Y-%m') 

makeAllKeys = function(year) { 
    allKeys = []; 
    for(var i = 0; i<12;i++) { // 12 months in a year 
     allKeys.push(yMFormat(new Date(year,i,1))); 
    } 
    return allKeys; 
} 

nestedData = nestedData.map(function(yearObj) { 
    return { 
     values: makeAllKeys(+yearObj.key).map(function(k) { 
       value = yearObj.values.filter(function(v) { return v.key == k; })[0]; 
       return value || ({key: k, values: 0}); 
      }) 
    }; 
});