2015-06-08 18 views
4

好读书,所以我有点用JavaScript一个小白的,我需要从CSV中读取数据,以与D3一个条形图。条形图对我来说没有问题,从csv文件读取的是。这是我的代码:的Javascript D3从CSV

var dataset; 
    d3.csv("gender_ratio.csv", function(data) { 
    dataset = data; 
    return dataset; 
}); 

var add = function(year, total, males, females){ 
    var year = { 
     year: year, 
     total: total, 
     males: males, 
     females: females 
    }; 
    newdata.push(year); 
    return newdata; 
}; 

for (var i = 0; i < dataset.length; i += 4){ 
    add(dataset[i], dataset[i+1], dataset[i+2], dataset[i+3]); 
    return newdata; 
}; 

有人能告诉我我在这里怎么了?我用modzilla firefox运行这个,所以浏览器安全不是这里的问题。

回答

4

呼叫加载CSV数据异步完成。这意味着您的for循环在数据加载之前运行。

如果将for循环进入呼叫到d3.csv回调函数,则数据将可用。

您也应该检查哪些返回的数据看起来像d3.csv。你的代码假定它返回一个平面数组,而它实际上返回一个对象数组,其中每个元素表示一行。如果您在函数的回调添加console.log你会得到什么样的数据看起来像一个更好的感觉。

你也有一个return声明for循环,这意味着它只能将退出循环之前处理数据的第一要素。

d3.csv("gender_ratio.csv", function(data) { 
    dataset = data; 
    // process data here 
    console.log(data); 
}); 
+0

噢,我现在明白了,非常感谢! – Yoeril

+0

请参阅我关于数据格式的最新答案 – knolleary

4

首先,D3的.csv功能的工作原理是异步的,因此你需要调用.csv函数内TE实际柱状图绘图功能。如果csv文件的第一行以列名为特征,您可以使用回调函数:

var dataset = []; 
d3.csv("gender_ratio.csv", function(d) { 
    return { 
    year: d.year, 
    total: d.total, 
    males: d.males, 
    females: d.females, 
    }; 
}, function(error, rows) { 
    dataset = rows; 
    drawBarChart(); /* <<-- This would be the call to the drawing function. */ 
});