2013-07-01 28 views
11

Tôi có một mảng hoặc đối tượng bao gồm một ngày và một số giá trị:Khỏa lấp sự thiếu hụt trong mảng D3 làm tổ

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

Tôi cố gắng để sử dụng d3.nest() để có được một số của các đối tượng này theo năm và sau đó theo tháng.

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

Điều này hầu như không hoạt động, ngoại trừ khi không có đối tượng trong tháng, dữ liệu lồng nhau không chứa bản ghi cho biết số 0 cho tháng đó. Có bất kỳ mẹo nào để nói với D3 điền vào những khoảng trống này không?

(Dĩ nhiên, tôi luôn có thể làm điều đó một cách tẻ nhạt, tức là để lặp qua tất cả các cấp độ lồng nhau và tạo ra một cấu trúc dữ liệu mới mà lấp đầy những khoảng trống.)

+0

Bạn có ý nghĩa gì khi lấp đầy khoảng trống, nghĩa là bạn muốn trả lại số tiền nào nếu không có gì? –

+1

Tôi muốn nó trả về một đối tượng với số lượng 0. Bằng cách đó khi tôi đang sử dụng thông tin để vẽ một biểu đồ thanh, có một bản ghi cho mỗi thanh và tôi có thể đơn giản lặp qua các đối tượng. Cách tiếp cận thay thế mà tôi đã nghĩ đến là không giả sử một bản ghi cho mỗi thanh và điều chỉnh thuật toán dựng biểu đồ cho phù hợp. – Naresh

+0

Không có gì trong D3 cho điều này, nhưng bạn có thể điền vào các giá trị bị thiếu bằng cách lặp qua cấu trúc lồng nhau sau đó. –

Trả lời

5

Hãy thử thêm các điểm dữ liệu mất tích sau khi giảm:

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}); 
      }) 
    }; 
}); 
Các vấn đề liên quan