【问题标题】:How does d3.csv function type works?d3.csv 函数类型如何工作?
【发布时间】:2018-04-10 16:09:17
【问题描述】:

我正在观看有关 D3.js 的教程,但我无法理解 d3.csv 函数的工作原理。

d3.csv("data.csv", type, function (myArrayOfObjects){
    myArrayOfObjects.forEach(function (d){
      console.log(d.x + d.y);
    });
  });

 function type(d){
   d.x = parseFloat(d.x);
   d.y = parseFloat(d.y);
   return d;
  }

data.csv 包含此值

x,y
100,100
130,120
80,180
180,80
180,40

该函数工作正常,在控制台上打印正确的值,但我无法理解对 type 函数的调用是如何工作的。 我以为 CSV 文件中的每个元素都调用了一次 type 函数,但是在插入 console.log 语句后,我注意到它只被调用了一次。它如何获取所有数据而不仅仅是第一对元素?

谢谢

编辑: 结果如下:

200
250
260
260
220

对于 csv 中的每个元素,该函数是只调用一次还是只调用一次?

【问题讨论】:

  • 你能提供一个minimal reproducible example 来证明这个问题吗?
  • 确切的控制台输出是什么?现在的方式,第一个 sn-p 应该打印200.0, 250.0, 260.0, 260.0, 220.0
  • @Stefano 我更新了我的答案以反映您对问题的编辑。
  • 我想将 console.log 放入 type 函数应该可以回答您的问题。
  • 分享这个测试!每个人都在说我们无法重现这种行为。

标签: javascript d3.js


【解决方案1】:

According to the docs, d3.csv 通过调用第二个参数来工作,本质上是一个映射函数。它指出您的示例等效于:

d3.request("data.csv")
    .mimeType("text/csv")
    .response(function(xhr) { return d3.csvParse(xhr.responseText, type); })
    .get(callback);

How d3 delimited works. 这是csvParse 的底层代码的文档空间。

dsv.parseRows(string[, row])

是声明In effect, row is similar to applying a map and filter operator to the returned rows.的例子

我创建了一个小的fiddle,它演示了你的情况,但没有复制问题。

更新

回答更新后的问题:该函数每行调用一次,如上所述。

【讨论】:

  • 我很好奇为什么这被否决以及如何改进我的答案?
  • 不是我,但我想,是因为你的假设是错误的。它被称为 row 转换函数,因为它为每一行调用。
  • 我删除了最后一行,我说它只被调用一次,现在我猜稍微准确了一点。
  • 但是,它如何符合 OP 的观察结果,即它只被调用一次?我认为我们还没有看到全貌,这要么是不可复制的,要么是一种误解。
  • MDN Docs。是的,根据 MDN 文档,应该为每个实例调用它。
猜你喜欢
  • 1970-01-01
  • 2018-06-18
  • 1970-01-01
  • 1970-01-01
  • 2020-09-06
  • 2016-06-11
  • 2023-03-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多