csv到d3.js中的数组

我正在使用这个parsingcsv文件,并创build一个数组数据在d3文档中指定:

d3.csv("afile.csv", function(data) { data.forEach(function(d) { d.date = formatDate.parse(d.date); d.price = +d.price; }); 

但是,如果在这个方法之后,我尝试调用data[0]它说它是未定义的。 这是因为data是一个引用,一旦d3.csv()超出范围被销毁? 如果是这种情况,我该如何克服这一点。 我需要从d3.csv()引用数据

d3.csv是一个asynchronous方法。 这意味着callback函数中的代码在数据加载时运行,但callback函数之后的代码将在请求完成后立即运行,当数据尚不可用时。 换一种说法:

 first(); d3.csv("path/to/file.csv", function(rows) { third(); }); second(); 

如果你想使用d3.csv加载的数据,你需要把这段代码放在callback函数中( third是上面):

 d3.csv("path/to/file.csv", function(rows) { doSomethingWithRows(rows); }); function doSomethingWithRows(rows) { // do something with rows } 

或者,你可以把它作为一个全局variables保存在窗口上,稍后可以参考:

 var rows; d3.csv("path/to/file.csv", function(loadedRows) { rows = loadedRows; doSomethingWithRows(); }); function doSomethingWithRows() { // do something with rows } 

如果你愿意,你也可以将加载的数据明确地分配给窗口对象,而不是声明一个variables,然后pipe理两个不同的名称:

 d3.csv("path/to/file.csv", function(rows) { window.rows = rows; doSomethingWithRows(); }); function doSomethingWithRows() { // do something with rows } 

我认为你的问题是时机,因为这是一个asynchronous调用。 因此,像你一样加载数据,但是在d3代码(Mike有'doSomethingWithRows()')的地方调用函数。 不要跟随你的D3代码进行任何更多的处理(Mike有'second()'),将代码移动到'doSomethingWithRows()'函数中。 它将有可用的数据,你走了…

我认为这个问题已经解决了,但是我面临着类似的问题,上面的讨论也没有那么有用。 所以张贴我怎么想出了这个问题的一个出路:在这里, data[0]未定义的原因可能是因为数据本身不被浏览器读取。 这种读取失败可能是由于直接加载数据(csv)文件,即使用以下命令d3.csv("myCSVfile.csv",....) 。 这种方法可能无法正常工作,因为Web应用程序通常需要从Web服务器加载文件(不确定为什么会出现这种情况)。 所以需要安装一个本地的Web服务器。 使用这个论坛来学习如何: 如何使用Python设置本地HTTP服务器 。 如果使用Python 3创build本地Web服务器,更新的代码将是: d3.csv("http://localhost:8000/myCSVfile.csv",.....)

你可以在callback函数外声明一个variables,然后用csv中的值赋值:

 var csv_data; d3.csv("afile.csv", function(data) { data.forEach(function(d) { d.date = formatDate.parse(d.date); d.price = +d.price; csv_data = data; }); 

然后在callback之外使用csv_data