Javascript d3.js:帮助理解回调函数的参数

Javascript d3.js:帮助理解回调函数的参数,javascript,d3.js,callback,parameter-passing,Javascript,D3.js,Callback,Parameter Passing,我正在努力学习d3.js,我发现这很有帮助,但我经常被他的代码中的小细节所困扰。例如,在his中,他使用d3.CSV解析CSV: d3.csv("data.csv", function(d, i, columns) { for (i = 1, t = 0; i < columns.length; ++i) t += d[columns[i]] = +d[columns[i]]; d.total = t; return d; }... d3.csv(“data.csv”,函数(

我正在努力学习d3.js,我发现这很有帮助,但我经常被他的代码中的小细节所困扰。例如,在his中,他使用
d3.CSV
解析CSV:

d3.csv("data.csv", function(d, i, columns) {
  for (i = 1, t = 0; i < columns.length; ++i) t += d[columns[i]] = +d[columns[i]];
  d.total = t;
  return d;
}...
d3.csv(“data.csv”,函数(d、i、列){
对于(i=1,t=0;i
我注意到匿名回调函数有第三个参数——我习惯于看到
函数(d,I){…}
,但不习惯看到
函数(d,I,columns){…}
。我花了相当长的时间浏览和谷歌搜索,但我找不到通过
d3.csv()
(或任何其他解析器)可以向回调函数传递哪些参数的基本事实

有人可以:

  • 告诉我这是在哪里记录的,或者
  • 解释我在这里可能缺少的更基本的d3或JavaScript概念

为了清楚起见,我了解通过
columns
参数传递的内容,我只是想了解我可以在哪里知道第三个参数是列名数组,以及可以传递哪些其他参数。

该函数的名称是行转换函数,或者简称为行函数(或者,在D3V3中,使用accessor函数)。您可以在的API中了解它

它接收到的参数在API中有很好的描述

如果指定了行转换函数,则为每一行调用指定的函数,并传递一个对象,表示当前行(d)、第一个非标题行从零开始的索引(i)以及列名的数组()

因此,如您所见,该函数接受3个参数,列名数组是第三个参数。与任何其他JavaScript函数一样,您可以向其传递更少的参数或更多的参数(多余的参数将被忽略)

这是它的一个演示。假设您有以下CSV:

foo,bar,baz
12,43,23
23,65,32
12,27,17
第三个参数是标题,即,
“foo”
“bar”
“baz”

var csv=`foo,bar,baz
12,43,23
23,65,32
12,27,17`;
变量数据=d3.csvParse(csv,函数(d,i,thirdArgument){
if(!i)console.log(thirdArgument)
})

这是一个非常好的深入回答。谢谢。几条后续评论/问题:这是一个非常好的深入回答。谢谢。几条后续问题:1)你怎么知道你是在处理一个row conv还是一个回调函数。我看到的例子中只有两个参数——如果它是一个row转换函数,每一行都应该传入,如果它是回调函数,整个数据对象都会传入,对吗?-2)你能同时指定一个row转换和一个回调函数吗?我猜这就是bl.ocks示例中的情况。如果是这样,我认为行conv fn修改了数据,然后修改后的数据被传递到回调函数?请不要在注释中提出进一步的问题,特别是当您没有确认答案时。把他们当作一个问题来问,这样其他人就可以回答。我才意识到我没有接受你的答案,然后回来接受你的答案,我已经接受了。此外,评论框下方的说明特别指出,“评论用于要求澄清…”感谢您的帮助。无需担心。事情比看起来更简单:如果只有一个函数,那么它总是回调函数。如果有两个函数,第一个是行,第二个是回调。