我有以下代码:valuelinePath = svg.append("path") .data([data]) .attr("class", "line2") .attr("d", valueLine) .attr("transform", "translate(42" + ", 70" + ")");var newvalueLine = d3.line() .x(function(d) { return x(d.years); }) .y(function(d) { return y(d[cityName]); }); valuelinePath .data([data]) .attr("class", "line2") .attr("d", newvalueLine) .attr("transform", "translate(42" + ", 70" + ")") .style("display", null);我假设newvalueline是由字符串生成器生成的字符串,但是没有,当我尝试调试newvalueline的值时,调试器告诉我这是一个函数newvalueLineƒ t(t){var a,c,s,f=t.length,l=!1;for(null==i&&(u=o(s=ee())),a=0;a<=f;++a)!(a<f&&r(c=t[a],a,t))===l&&((l=!l)?u.lineStart():u.lineEnd()),l&&u.point(+n(c,a,t),+e(c,a,t));if(s)return u=null,s+""||null}但是当我访问刚刚分配给它的valuelinePath的attr(“ d”)时,它能够返回该路径的正确字符串表示形式valuelinePath.attr("d")"M-3285.4586214143906,388.2L-3285.458621411788,307.8L-3285.4586214091855,124.79999999999995L-3285.4586214065826,97.19999999999999L-3285.45862140398,12.599999999999966L-3285.4586214013775,243L-3285.4586213987745,43.19999999999999L-3285.458621396172,14.400000000000034"那么,如何获取newvalueLine的字符串表示形式以进行调试,而不必将其分配给valuelinePath属性并再次检索它呢?为什么函数不是字符串?我读过的东西https://www.dashingd3js.com/svg-paths-and-d3jshttps://bl.ocks.org/d3indepth/e312c205b6b07757551bffafb265589b我是否假设线路生成器像上面的示例一样返回路径字符串?没有? 最佳答案 要获取行生成器的返回值(该值是一个字符串),您要做的就是将数据数组传递给它。例如:const data = d3.range(10).map(d => [d, d]);const lineGenerator = d3.line();console.log(lineGenerator(data))<script src="https://cdnjs.cloudflare.com/ajax/libs/d3/5.7.0/d3.min.js"></script>这几乎可以回答标题中的问题。但是,我们还必须解释您的困惑。您的代码中让您感到困惑的部分是:.attr("d", newvalueLine)在阅读了您的问题之后,在我看来,您虽然newvalueLine已经是一个字符串,但已传递给路径的d属性。混乱在这里变得很明显:“我假设newvalueline是由字符串生成器生成的字符串,但是没有,当我尝试调试newvalueline的值时,调试器告诉我这是一个函数”。但是,您可以清楚地看到newvalueLine是一个函数。这里发生的事情在D3 API中有很好的记录。对于.selection.attr这样的几种方法,可以将常量或函数作为value属性传递。如果value是一个函数,则调用该函数并使用其返回值。正如API所说:  selection.attr(名称[,值])    [...]如果该值是一个函数,则会为每个选定元素进行评估。[...]然后,该函数的返回值用于设置每个元素的属性。您可能会问:“但是,传递给newvalueLine的参数在哪里?”再次,API说明:  [...]如果该值是一个函数,则会为每个选定元素按顺序传递当前数据(d),当前索引(i)和当前组(节点),并对其进行评估,当前的DOM元素(nodes [i])。因此,这:.attr("d", newvalueLine)是一样的:.attr("d", function(datum){ return newvalueLine(datum);});我们可以在下面的代码片段中轻松演示这一点,该代码片段完全不使用D3。这里有一个名为callback的函数,该函数获取传递的参数并将其乘以2。一个函数foo接受两个参数来设置给定值,如果第二个参数是它调用的函数。请注意如何在callback中使用foo设置value的值。首先,仅使用函数名称,不带任何参数:function callback(datum) { return datum * 2;};function foo(firstParameter, secondParameter) { if (typeof secondParameter === "function") return secondParameter(firstParameter);};//Look here:const value = foo(2, callback);console.log(value)现在,显式传递参数:function callback(datum) { return datum * 2;};function foo(firstParameter, secondParameter) { if (typeof secondParameter === "function") return secondParameter(firstParameter);};//Compare the snippet above with this:const value = foo(2, function(d) { return callback(d)});console.log(value)如您所见,参数将自动传递给回调。
10-07 13:36