2012-04-09 41 views
23

Tôi đang cố đọc dữ liệu vào hiển thị lịch của mình bằng JSON. Tại thời điểm nó hoạt động tuyệt vời sử dụng một tập tin CSV:d3 - đọc dữ liệu JSON thay vì tệp CSV

d3.csv("RSAtest.csv", function(csv) { 
    var data = d3.nest() 
    .key(function(d) { return d.date; }) 
    .rollup(function(d) { return d[0].total; }) 
    .map(csv); 

rect.filter(function(d) { return d in data; }) 
     .attr("class", function(d) { return "day q" + color(data[d]) + 
"-9"; }) 
     .select("title") 
     .text(function(d) { return d + ": " + data[d]; }); 

}); 

Nó đọc dữ liệu CSV sau:

date,total 
2000-01-01,11 
2000-01-02,13 
. 
. 
.etc 

Bất kỳ gợi ý về làm thế nào tôi có thể đọc dữ liệu JSON sau thay vì: {"2000-01-01":19,"2000-01-02":11......etc}

Tôi đã thử những điều sau nhưng nó không hoạt động đối với tôi (datareadCal.php spits ra JSON cho tôi):

d3.json("datareadCal.php", function(json) { 
    var data = d3.nest() 
    .key(function(d) { return d.Key; }) 
    .rollup(function(d) { return d[0].Value; }) 
    .map(json); 

nhờ

Trả lời

13

Bạn có thể sử dụng d3.entries() để biến một vật thể đen vào một mảng các cặp/giá trị chính:

var countsByDate = {'2000-01-01': 10, ...}; 
var dateCounts = d3.entries(countsByDate); 
console.log(JSON.stringify(dateCounts[0])); // {"key": "2000-01-01", "value": 10} 

Một điều bạn sẽ nhận thấy, mặc dù, đó là kết quả isn mảng không được sắp xếp đúng cách. Bạn có thể sắp xếp chúng theo khóa tăng dần như sau:

dateCounts = dateCounts.sort(function(a, b) { 
    return d3.ascending(a.key, b.key); 
}); 
+0

Hi Shawn, nhờ nhận được trở lại với tôi về điều này nhưng tôi vẫn khá lạc. Tôi đang tìm cách thay đổi ví dụ lịch d3 từ việc sử dụng dữ liệu đọc từ tệp CSV để sử dụng JSON: http://mbostock.github.com/d3/ex/calendar.html – eoin

+0

Xin chào Shawn, tôi mất một lúc để tìm ra (Tôi đang tung hứng một công việc không phải lập trình ban ngày với trường ban đêm và tự dạy mình dữ liệu & lập trình ..) nhưng bạn đã đúng là định dạng JSON với d3.entries. Điều đó làm việc nhưng khác trong mã của tôi, tôi quên để phù hợp với năm của khung lịch trống của tôi với năm dữ liệu của tôi. Nói cách khác lịch trống của tôi là cho năm 1999 và dữ liệu JSON của tôi là cho năm 2000. Cảm ơn tất cả sự giúp đỡ và kiên nhẫn của bạn . – eoin

6

Biến tệp .json thành tệp .js được bao gồm trong tệp html của bạn. Bên trong tệp .js của bạn có:

var countsByDate = {'2000-01-01':10,...}; 

Sau đó, bạn có thể tham chiếu countByDate .... không cần đọc từ tệp.

Và bạn có thể đọc nó với:

var data = d3.nest() 
.key(function(d) { return d.Key; })   
.entries(json);  

Là một sang một bên .... d3.js nói nó tốt hơn để thiết lập json của bạn lên như:

var countsByDate = [ 
    {Date: '2000-01-01', Total: '10'}, 
    {Date: '2000-01-02', Total: '11'}, 
]; 
+1

Cảm ơn Ginny điều này thực sự hữu ích. – eoin

+1

Điều này nghe có vẻ thực sự hacky – circuitry

Các vấn đề liên quan