Javascript 在阈值范围内理解反相器的范围

Javascript 在阈值范围内理解反相器的范围,javascript,d3.js,Javascript,D3.js,我正在慢慢地翻阅迈克·博斯托克的《乔洛佩斯地图》,并一边写下每一点,以确保我理解它。我有一点特别难以理解。以下是在线示例: 在代码中的某一点上,Bostock拥有一系列颜色,并将其反向范围(如果输入到颜色比例中,将产生该颜色的最小值和最大值)添加到贴图中。对于每个“d”(两种颜色的数组),他使用color.invertExtent(d)获得最小值和最大值。在函数的末尾,他将“d”值(现在是由两个数字组成的数组,最小值和最大值)返回到映射。这我理解 g.selectAll("rect") .d

我正在慢慢地翻阅迈克·博斯托克的《乔洛佩斯地图》,并一边写下每一点,以确保我理解它。我有一点特别难以理解。以下是在线示例:

在代码中的某一点上,Bostock拥有一系列颜色,并将其反向范围(如果输入到颜色比例中,将产生该颜色的最小值和最大值)添加到贴图中。对于每个“d”(两种颜色的数组),他使用color.invertExtent(d)获得最小值和最大值。在函数的末尾,他将“d”值(现在是由两个数字组成的数组,最小值和最大值)返回到映射。这我理解

g.selectAll("rect")
  .data(color.range().map(function(d) {
      d = color.invertExtent(d);
      if (d[0] == null) d[0] = x.domain()[0];
      if (d[1] == null) d[1] = x.domain()[1];
      return d;
    }))

然而,他还包括两个我不理解的“如果”块。为什么它们是必要的?为什么这个双色数组的d[0]或d[1]会等于“null”?为什么他要把它们分配给x.domain[0](在本例中是600)和x.domain[1],x.domain[1]是860。在什么情况下,结果会是“null”呢?

文档中实际描述了这一点。如果你看一下,你会看到:

返回域[x0,x1]中值在范围内对应值的范围,表示从范围到域的反向映射。此方法对于交互非常有用,例如确定与鼠标下像素位置对应的域中的值。例如:

var color = d3.scaleThreshold()
    .domain([0, 1])
    .range(["red", "white", "green"]);

color.invertExtent("red"); // [undefined, 0]
color.invertExtent("white"); // [0, 1]
color.invertExtent("green"); // [1, undefined]
你看到那些未定义的代码了吗?对于范围的第一个和最后一个值,它们是适当的

问题是,对于矩形的enter选择,不能使用带有
未定义
未定义==null
)的数组。因此,那些
if
所做的就是转换这个数组:

[[undefined,2],[2,3],[3,4],[4,5],[5,6],[6,7],[7,8],[8,9],[9, undefined]]
在这一点上:

[[1,2],[2,3],[3,4],[4,5],[5,6],[6,7],[7,8],[8,9],[9,10]]
这是一个现场演示。首先,如果没有
if
s:

var scale=d3.scaleThreshold()
.域(d3.范围(1,9,1))
.范围(d3.范围(9));
console.log(scale.range().map)函数(d){
d=反相器范围的比例(d);
返回d;
}))