读取文件,变量赋值和范围如何工作?

时间:2017-09-29 14:52:25

标签: javascript d3.js

我试图了解如何将文件读入javascript,我遇到的代码here真的让我陷入了循环。以下是我的想法:

  1. 读入csv并将其分配给变量" data"它只存在于{}内。
  2. 然后为每行数据将其分配给变量" d"并做点什么。
  3. 我的问题:

    你怎么能参考" d"在foreach循环之外?它不是循环的本地吗?什么变量类型是" d.sales",对对象d的某种引用?最后,哎呀" d.salesperson"得到了什么?

    段:

    d3.csv("sales.csv", function(error, data) {
      if (error) throw error;
    
      // format the data
      data.forEach(function(d) {
        d.sales = +d.sales;
      });
     // Scale the range of the data in the domains
    x.domain(data.map(function(d) { return d.salesperson; }));
    ....
    

2 个答案:

答案 0 :(得分:1)

如果您查看该页面的代码。 csv文件包含salespersonsales  1 - 您说正确读入文件并将内容分配给data
是正确的  2 - 种类。您应该查看forEach的作用及其格式。 https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/forEach
但是,在这种情况下,d是对数据中每个数据的引用。给定csv,每个数据都有sales属性和salesperson属性。

  

你怎么能参考" d"在foreach循环之外?它不是循环的本地吗?什么变量类型是" d.sales",对对象d的某种引用?最后,哎呀" d.salesperson"得到了吗?

d只是一个参考。你可以任意命名。它只是对数据中每个数据的引用。它们不是d,尽管它们引用相同的数据。

data.forEach(function(value, index, array){});  

forEach函数是一个循环,可以访问其循环的数据中的以下项,value - 这是数组中的每个数据,index这是索引该值,array是数组本身。您的案例中的d是赋予函数value部分的名称。

当d3读入文件时,它会创建一个对象数组,每个对象都具有基于csv文件中标题的属性。在这种情况下它是这样的:

[{
    "salesperson": "Bob",
    "sales": 33 
}, {
    ...
}]

在尝试拆分d3图之前,你应该真正做一些基本的javascript。此外,如果你不想尝试图形并且只是尝试读取csv文件,那么d3就是矫枉过正。

答案 1 :(得分:1)

使用JavaScript记住的一件好事是没有块级范围。那会让你感到不安,因为这不会是循环的第34个地方。但那真的对你没有帮助。 " d"只是一个任意命名的引用,它的作用域是每个函数,它出现在你的代码片段中。

  1. 是的,数据是一个数组。
  2. .forEach和.map是一个数组函数,它将一个函数作为参数应用于数组(数据)的每个元素(d)。
  3. d3.csv()函数读取文件并创建数据数组的每个元素,每个元素都包含sales和salesperson属性。