2016-11-16 63 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