【问题标题】:Issues with populating arrays from csv(dsv) parsing从 csv(dsv) 解析填充数组的问题
【发布时间】:2021-07-22 01:35:00
【问题描述】:

我对javascript很陌生,基本上是第一次使用它来编写直方图绘图仪应用程序。我的问题是,我正在导入一个数据文件,理想情况下将(一些)条目发送到一个数组中。问题是,一旦我这样做了,我就无法访问数组中的条目。 我怎么能解决这个问题?发布下面的代码以防万一。 谢谢!

let filename = 'uploads/testdata.dat';
    const data_e = new Array();
    d3.dsv(" ",filename, (event)=>{
        data_e.push(event.mass);
        return data_e
    })

console.log(data_e);

哪些输出


    Array []
​
     0: "734.770828169"
​
     1: "85.0912893849"
​
     2: "87.383924186"
​
     ...

但是,如果我想获得一个值: console.log(data_e[0]) //output: undefined

Edit1:我推送的值在console.log(event.mass) 中。 输出:

734.770828169 analyzer.php:19:12
85.0912893849 analyzer.php:19:12
87.383924186 analyzer.php:19:12
(...)

Edit2:如果我在 dsv 函数中调用 console.log(data_e),我的数组被填充时,每次迭代都会得到一行,以

结尾
Array(7178) [ "734.770828169", "85.0912893849", "87.383924186", "1274.99805502", "91.5349415148", "80.2766459668", "1396.69489276", "91.5584443363", "94.52017453", "1582.29197222", … ] 

这确实是我想要得到的对象。但是如果我想把它带到函数dsv() 之外,这样我得到和上面一样的输出呢?

Edit3:调用 console.log(JSON.stringify(event.mass)) 给出:

  • 再次,每次“迭代”(我认为)一行,这是有道理的。我只想在该函数之外使用完整的数组(或者这可能只是一件愚蠢的事情.-.)
"734.770828169" analyzer.php:19:12
"85.0912893849" analyzer.php:19:12
"87.383924186" analyzer.php:19:12
"1274.99805502" analyzer.php:19:12
(...)

【问题讨论】:

  • 请提供console.log(event.mass) 的输出。如果您不想显示实时数据,可以通过虚拟条目对其进行混淆。我只是想检查一下结构
  • 用输出编辑,它只是一系列数字数据(可能是字符串,但以后可以修复)

标签: javascript arrays d3.js


【解决方案1】:

不要在循环中使用return,因为你会立即离开它。更重要的是,我认为d3.dsv() 是一个异步函数。意味着此方法之外的控制台日志必须返回 undefined,因为 Javascript 不会等待 d3.dsv() 完成。并且您的数组 data_e 当前未定义。

let data_e = new Array();

以这种方式实例化它,您会看到,console.log() 将输出 [] 而不是 undefined

let data_e = [];

d3.dsv(" ",filename, (event)=>{
  // your code
})

console.log(data_e);

实际上,我找不到关于如何在d3.dsv() 完成时获得触发器的手册。但是一开始就尝试这种方式。它并不完美,但它只是应该向您展示它确实有效;

let filename = 'uploads/testdata.dat';
const data_e = new Array();

// run the filter
d3.dsv(" ",filename, (event)=>{
    data_e.push(event.mass);
})

// wait 2 seconds, then show the array in the console
setTimeout( () => {
    console.log(data_e);
}, 2000);

【讨论】:

  • 嗯,我已经尝试过了,但我不确定这是问题所在。唯一不同的是,现在我得到了一个数组数组Array [] ​ 0: Array ["734.770828169"] ​ 1: Array["85.0912893849"] ...
  • 这太可怕了。请再分析一下。请提供console.log(JSON.stringify(event.mass)) 的输出。如果它变得很长,您可以缩短字符串。重要的是前 200 个字符左右。只是为了更好地理解结构。
  • 使用该输出编辑!
  • 好的,所以你的问题是,d3 异步运行。我发布了您的解决方案只是为了表明您的数据实际上在外部可用。但不是在您的console.log() 被解雇的时候。请尝试我的演示。你会看到它有效。这并不完美,而是一个开始。
  • 哦,这很公平!至少这是一个让事情变得更清晰的好开始。非常感谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-04-19
  • 2019-07-18
  • 2015-09-08
  • 2011-06-10
  • 2021-04-12
  • 1970-01-01
相关资源
最近更新 更多