【问题标题】:Copy data from csv into array in D3将数据从 csv 复制到 D3 中的数组中
【发布时间】:2016-05-08 06:11:42
【问题描述】:

我知道以前有人问过这个问题,但由于某种原因,他们的解决方案对我不起作用。

我正在尝试使用 CSV 文件中的数据填充两个数组,其中:

name,value
alpha,34
beta,12
delta,49
gamma,89

我现在正在尝试的是

var field1=[];
var field2=[];

d3.csv("data.csv",function(csv){
            csv.map(function(d){
                field1.push(d.name);
                field2.push(+d.value);
            })
        });

console.log("field1",field1);
console.log("field2",field2);

当我在浏览器上查看控制台时,我看到:

field1 数组 [ ] field2 数组 [ ]

地点:

field1:
Array[0]
  0:"alpha"
  1:"beta"
  2:"delta"
  3:"gamma"

field2:
Array[0]
  0:34
  1:12
  2:49
  3:89

但是,当我尝试访问 field1[0] 时,我得到的值为 undefined

field1 undefined

我猜正在发生的事情是 field1 数组有一个“名称”列的数组,但我也无法通过 field[0][0] 访问第一个元素。我得到的是:

TypeError: field1[0] is undefined 

我对 JavaScript 很陌生,我似乎不明白为什么数组没有正确填充为一维数组,或者我做错了什么。我知道我可以在每行访问 csv 时遍历每一行,但我想将 csv 值存储在数组中以便在脚本中全局使用。

我浏览过的链接是:

但我似乎遗漏了一些东西..请帮忙!

【问题讨论】:

    标签: javascript arrays csv d3.js


    【解决方案1】:

    原因是

    d3.csv("data.csv",function(csv){
    

    是一个 ajax 调用,所以你不能写下面这样的东西(你的控制台日志在 ajax 完成之前被调用,所以你会得到意想不到的结果)

    var field1=[];
    var field2=[];
    
    d3.csv("data.csv",function(csv){
                //executed after successful loading of data
                csv.map(function(d){
    
                    field1.push(d.name);
                    field2.push(+d.value);
                })
            });
    //called before the loading of AJAX call got completed
    console.log("field1",field1);
    console.log("field2",field2);
    

    正确的做法是:

    var field1=[];
    var field2=[];
    
    d3.csv("data.csv",function(csv){
                csv.map(function(d){
                    field1.push(d.name);
                    field2.push(+d.value);
                })
                //called after the AJAX is success
                console.log("field1",field1);
                console.log("field2",field2);
                console.log("field1",field1[0]);
            });
    

    工作代码here

    希望这会有所帮助!

    【讨论】:

    • 这行得通!但是,是否不可能以某种方式将这些数据存储在读取的 csv 之外,以便执行诸如连接来自多个 csv 文件的数据并对其进行处理以进行可视化之类的操作?
    • 没有嵌套就是
    • 是的,你可以检查这个答案stackoverflow.com/questions/21842384/… 或使用 d3-queue 加载几个 csv github.com/d3/d3-queue
    • 是的,这个解决方案是正确的,但如果您需要对 CSV 数据执行 20 或 30 次操作,则该解决方案是正确的,但难以扩展,并且会导致代码不可读。愚蠢的异步方法!必须有更好的方法...
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-03-18
    • 2016-05-22
    • 1970-01-01
    • 1970-01-01
    • 2013-11-03
    • 1970-01-01
    • 2014-02-14
    相关资源
    最近更新 更多