2013-07-01 18 views
11

Mam tablicy lub obiekty składające się z datą i niektóre wartości:Wypełnianie luk w D3 tablicy gniazdowania

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

Próbuję użyć d3.nest(), aby uzyskać liczbę tych obiektów przez rok a następnie przez miesiąc.

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); 

To prawie działa, oprócz tego, że gdy nie ma żadnych przedmiotów w miesiącu, dane zagnieżdżone nie zawiera zapis wskazujący liczbę 0 dla danego miesiąca. Czy jest jakaś sztuczka, aby powiedzieć D3, aby wypełnić te luki?

(Oczywiście, mogę zawsze zrobić to żmudny sposób, czyli do pętli wszystkich zagnieżdżonych poziomów i stworzyć nową strukturę danych, która wypełnia luki.)

+0

Co masz na myśli, wypełniając luki, tj. ile haczyków chcesz zwrócić, jeśli nic nie ma? –

+1

Chcę, aby zwracał obiekt z liczbą 0. W ten sposób, gdy używam informacji do narysowania wykresu słupkowego, dla każdego słupka jest zapis i mogę po prostu przechodzić między obiektami. Alternatywne podejście, o którym myślałem, to nie zakładać rekordu dla każdego paska i odpowiednio dostosować algorytm renderowania wykresu. – Naresh

+0

W tym przypadku nie ma nic w D3, ale można uzupełnić brakujące wartości, wykonując po nich iterację nad strukturą zagnieżdżoną. –

Odpowiedz

5

spróbuj dodać brakujące punkty danych, po redukcja:

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}); 
      }) 
    }; 
}); 
Powiązane problemy