2013-07-01 77 views
11

我有一個數組或由一個日期的對象和一些值:填充D3陣列的縫隙築巢

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

我想使用d3.nest()來獲取這些對象通過一年的計數然後按月。

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

這幾乎是工作,只是當有一個月沒有對象,嵌套的數據不包含指示在該月的0計數的記錄。是否有任何訣竅可以告訴D3填補這些空白?

(當然,我總是可以做到這一點的繁瑣方式,即遍歷所有嵌套的水平和創建的空白填補新的數據結構。)

+0

填補差距的意思是什麼,即如果什麼都沒有,你希望它返回什麼數目? –

+1

我希望它返回一個計數爲0的對象。這樣,當我使用信息繪製條形圖時,每個條都有一條記錄,我可以簡單地遍歷對象。我想到的另一種方法是不要爲每個小節假設記錄,並相應地調整圖表渲染算法。 – Naresh

+0

D3中沒有任何內容適用於此,但您可以通過在之後迭代嵌套結構來填充缺失的值。 –

回答

5

嘗試後,將丟失的數據點減少:

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