2016-11-16 62 views
1

考虑以下TSV文件列:D3 TSV/CSV在访问(行)功能

Code k1 k2 
pf_1 0.2 0.3 
pf_2 0.3 0.7 
pf_3 0.2 0.4 
pf_4 0.1 0.6 
pf_5 0.8 0.9 

我一直在试图了解如何将下面的代码工作,但还没有找到一个明确的答案:

d3.tsv("test.tsv") 
.row(function(d, i, columns){ d.total = columns.length; return d;}) 
.get(function(d){ console.log(d);}); 

的具体问题,我已经有以下几种:

  • 什么是基本的解析功能,该次映射访问器(行)函数中列名的ird(列)参数?

  • 为什么我需要访问器函数中的行迭代器(i)参数?

回答

2

什么是第三个(列)参数映射到列名在访问(行)函数的基本parse函数?

的存取功能,也被称为row conversion function,被调用于各行的功能,它需要3个参数(这会回答你的第二个问题进一步下跌):

  • 第一个参数是所述
  • 的第二个参数是索引,从零开始
  • 第三个参数是列名 array

第三个参数很有意思,它在D3 v4.x中引入。我认为,它回答你的第一个问题:

当您将CSV(或TSV),d3.csv(或d3.tsv)创建与头部的数组属性,名为columns(照顾有像for循环...在循环中,因为it will include that property)。在您的例子中,它是:

columns: ["Code", "k1", "k2"] 

它带领我们到你的第二个问题:

为什么我需要在访问功能的行迭代器(我)的说法?

你不知道。问题是这段代码使用第三个参数,它是columns属性,并且为了能够使用第三个参数,我们必须提供前面的两个参数,即使我们不使用它们:

.row(function(d, i, columns){ d.total = columns.length; return d;}) 
//3rd argument---------^ 

因此,该代码确实是越来越的columns.length的价值,这是3,创建一个新的属性,每个对象是什么:

d.total = columns.length; return d; 

所以,对象最终会这样:

{Code: "pf_1", k1: "0.2", k2: "0.3", total: 3} 

随着新的属性total

+1

杰出的答案!非常感谢。 – spyrostheodoridis