Javascript 将变量i传递给D3函数

Javascript 将变量i传递给D3函数,javascript,d3.js,Javascript,D3.js,我在循环中运行D3。我想在D3函数中传递变量“I”,但我无法这样做。这是我的密码-你能告诉我我做错了什么吗 很好用 不起作用 完整代码 一般来说,使用D3时不需要循环。考虑到D3对数据的处理,这通常是完全不必要的。的确,我们确实有时在D3DataViz中使用循环,但仅在非常特定的情况下使用循环来解决非常特定的问题。对于大多数情况,当我们看到D3代码使用循环时,我们倾向于认为代码没有正确地使用D3功能。在代码中,您将For循环中的i与匿名函数中的i混合在一起。它们不一样 因此,要使用第二个参数(即

我在循环中运行D3。我想在D3函数中传递变量“I”,但我无法这样做。这是我的密码-你能告诉我我做错了什么吗

很好用

不起作用

完整代码

一般来说,使用D3时不需要循环。考虑到D3对数据的处理,这通常是完全不必要的。的确,我们确实有时在D3DataViz中使用循环,但仅在非常特定的情况下使用循环来解决非常特定的问题。对于大多数情况,当我们看到D3代码使用循环时,我们倾向于认为代码没有正确地使用D3功能。在代码中,您将For循环中的i与匿名函数中的i混合在一起。它们不一样

因此,要使用第二个参数(即索引)访问数据数组,请忽略for循环:只需在选择中传递它

下面是一个简单的示例,使用enter选择。我们检查dataz值是否为蓝色。如果是,我们将不透明度设置为0.1:

var svg=d3.selectsvg; var dataz=[青色、棕色、蓝色、紫色]; var circles=svg.selectAll.circles .dataz 进来 .附加圆; 第20页 .自然减员,50 .attrcx,d,i=>i*50+40 .attrfill,d=>d .黑色 .stylefill不透明度,d,i=>dataz[i]==蓝色?0.1 : 1
忽略其他情况下可能出现问题的变量名称,这里的问题是由于循环索引变量不存在或从D3js数据函数访问时具有不同的值

确保在数据函数中使用当前循环值的唯一方法是在创建数据函数时提供它,因此此索引值存在于数据函数的范围内

这应该行得通,不要尝试

  for (idx = 0; idx < dataz.length; idx++) {
    d3.select(list[idx])
      .style("fill", dataz[i].color)
      // Immediately Invoked Function Expression will do the trick!
      .style("fill-opacity", (function(d, i) {
        if (dataz[idx].color === "#ffff") {
          return "0";
        } else {
          return "0.5"
        }
      })(idx));
  }

杰拉尔多,我非常感谢你提供的答案。我也知道,在使用D3脚本时,循环通常是不必要的,但正如您自己承认的那样,当您实际需要使用循环时,有时会出现一些情况。我如何将变量I传递给D3匿名函数…?你是指循环中的变量I?用另一个名字来称呼它,j,k或者其他什么。或者第二个参数的另一个名称。我指的是下面的循环:d3.selectcircle.attrfill,d,I=>console.logi;不幸的是,代码总是返回“0”,这意味着我没有正确地传递变量I。这正是我所说的:你在支付索引,而不是for循环中的I。JavaScript具有函数作用域。所以,在for循环中为变量使用另一个名称。不,你做错了什么。再次检查我的第二个代码段,我刚刚编辑了它。变量冲突。你用“我”两次。将for循环中的i更改为“j”,它将起作用确保在数据函数中使用当前循环的值的唯一方法是在创建数据函数时提供它。这是不正确的。只是更改变量名,没有任何IIFE,效果很好:除此之外,OP的问题中没有数据函数。你是对的,我认为作为参数提供的函数是在不同的时间调用的,但事实并非如此。关于数据函数,我以这种方式调用函数d,I{…}作为style方法上的fill opacity样式的值提供。也许我用错词了。。。你对数据函数的理解是什么?数据函数是获取数据数组的函数。。。它的字面名称是data:data[array]。这里是:
.style("fill-opacity", function(d, i) {
            if (dataz[i].color === "#ffff") {
              return "0";
            });
  for (i = 0; i < dataz.length; i++) {
    d3.select(list[i])
      .style("fill", dataz[i].color)
      .style("fill-opacity", function(d, i) {
        if (dataz[i].color === "#ffff") {
          return "0";
        } else {
          return "0.5"
        }
      })
  }
  for (idx = 0; idx < dataz.length; idx++) {
    d3.select(list[idx])
      .style("fill", dataz[i].color)
      // Immediately Invoked Function Expression will do the trick!
      .style("fill-opacity", (function(d, i) {
        if (dataz[idx].color === "#ffff") {
          return "0";
        } else {
          return "0.5"
        }
      })(idx));
  }