javascript - 带有 d3.line 函数的 For 循环

标签 javascript d3.js

我在使用 d3.line 函数的 for 循环中遇到了奇怪的行为。 循环如下所示:

for (zzz = 0; zzz < 3; zzz++) {
    lines = d3.line()
        .x(function(d,i) { console.log(zzz); x([1,2,3]) })
        .y(function(d,i) { console.log(zzz); y([1,2,3]) });
}

通常情况下,我期望 console.log这个看起来像

0
1
2

相反,我得到了

3
3
3

我花了几天时间试图找出原因......有人可以帮忙吗?

Here is a jfiddle 。它只具有生成控制台输出的最低限度。

最佳答案

该 block :

for (zzz = 0; zzz < 3; zzz++) {
    lines = d3.line()
        .x(function(d,i) { console.log(zzz); x([1,2,3]) })
        .y(function(d,i) { console.log(zzz); y([1,2,3]) });
}

不记录任何内容。检查这个演示:

for (zzz = 0; zzz < 3; zzz++) {
  console.log("Outside d3.line, zzz is " + zzz);
  lines = d3.line()
      .x(function(d,i){console.log("Inside d3.line nothing is printed!");x([1,2,3]) })
      .y(function(d,i){console.log("Inside d3.line nothing is printed!");y([1,2,3]) });
}
<script src="https://d3js.org/d3.v4.min.js"></script>

原因是d3.line()没有被调用(因此,不会在控制台中打印任何内容)。 d3.line()仅当您实际附加路径时才调用(使用 lines )。到那时,for循环已完成并且 zzz是 3(如果您使用 let ,则它会是 2 )。

此外,您得到 3三次只是巧合,与for无关。循环从 0 到 2(循环三次),但前提是您将具有三个值的数组传递给 lines在你的 fiddle 中:lines([1, 2, 3]) 。在下面的演示中,它将打印 zzz每个函数只需一次:

var svg = d3.select("body");
var x = d3.scaleLinear().range([0, 100]);
var y = d3.scaleLinear().range([100, 0]);

for (zzz = 0; zzz < 3; zzz++) {
  lines = d3.line()
  .x(function(d,i) { console.log("first console.log: " + zzz); x([1,2,3]) })
  .y(function(d,i) { console.log("second console.log: " + zzz); y([1,2,3]) });
}

svg.append("path").attr("d", lines([1]));
<script src="https://d3js.org/d3.v4.min.js"></script>

所以,简而言之,您只是定义 lines里面 for循环。

关于javascript - 带有 d3.line 函数的 For 循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40054041/

相关文章:

javascript - 如何在鼠标悬停事件的圆环图上显示文本

javascript - 选择文本节点来替换内容

javascript - 将数组中的值插入到不同的 span 标签中

javascript - ng 级 : Assign a single class to multiple expression

javascript - 如何在 D3.js 中拖动组 (g) 元素?

javascript - D3 Javascript - 使用数据绑定(bind)重复一组形状

javascript - 如何从指针访问对象?

javascript - NodeJS - 水线进行 4 次连续收集计数的最佳方法

javascript - flask +d3.js : Passing multiple datasets to html

javascript - d3 v2 防止在视口(viewport)外缩放和平移图表