【问题标题】:How to make sense of `f(array[i], i, array)` found in `d3.min()` source code?如何理解 `d3.min()` 源代码中的`f(array[i], i, array)`?
【发布时间】:2016-06-30 13:10:18
【问题描述】:

我是 d3 的新手,并尝试通过阅读其源代码来学习它。我从最简单的函数d3.min() 开始。然而,我的头发被一个看似很常见的代码f(array[i], i, array) 撕裂了。

  1. 我认为f()应该是一个函数;
  2. array[i] 正在访问索引 i 处的 array 的元素;
  3. iarray 的索引;
  4. array 是用户给出的数字数组。

如果以上4个理解都正确,那么f()作为用户给定的函数,其参数必须是array[i]iarray这三个。但我们不必使用所有这些论点,对吧?

f() 的意义何在?谁能提供d3.min(array, f) 的任何有用示例/用法,其中f 不是null

【问题讨论】:

  • 感谢@NiettheDarkAbsol,这个链接很有帮助。
  • 是的,您的观点是正确的。不,你不必传递所有的论点。但是,如果您只传递两个参数,则前两个参数将被填充,而其他参数则不会。但是如果你通过说, f(val,val, null, val) 这可能是一种传递你想要的任何参数的方法。在这里无法知道 f 的全部意义,因为我们不知道 f 是什么,但基本上它是一个应该使用传递给它的参数的函数
  • 就个人而言,我认为您学习 D3 的方法会比较麻烦。如果您想了解有关它的工作原理的更多信息,请查看文章D3.js Source Code Walkthrough Part 1,它通过采用自上而下的视角而不是自下而上的方法为您提供了一个良好的开端。不幸的是,尽管它的标题,我不知道本文的任何第 2 部分。但请记住,正如文章中提到的,首先通过阅读一些教程来很好地掌握 D3 方法是必不可少的。
  • 感谢@GerardoFurtado,我非常感谢您在不阅读源代码的情况下如何成为优秀的 dataviz 编码器的方法。你能告诉我更多吗?

标签: javascript arrays d3.js


【解决方案1】:

这里有点混乱。首先,d3.mind3.max 可以在有或没有访问器的情况下使用。在 API 中:

d3.min(array[, accessor])

逗号前的这个方括号表示它是可选的,不是强制性的。所以,你可以有一个简单的:

var something = d3.max(someArray);

或者,使用访问器(如您所问,访问器不是null 的示例):

var something = d3.max(data, function(d) {
    return d.foo
});

现在我们来回答您的问题:您可以在上面的代码中看到访问器函数只有 1 个参数。

您提供的示例是 D3 用于处理访问器函数的源代码。如果您查看代码,您会看到array[i]iarray。这 3 个参数不是用户提供的,而是由 D3 源代码传递给访问器函数的。

请记住,在 JS 中,您可以传递比参数更多的参数或比参数更少的参数。

【讨论】:

  • 实际上,访问器函数最多可以有三个参数,即当前元素、索引和数组本身。这就是源 sn-p 所做的:使用索引 i 处的当前元素 array[i] 调用访问器 f,并提供 array 本身。但是,您是对的,您可以通过相应地指定参数来获得什么。 @肯尼
  • 谢谢,高积云。我做了一个小版本,以明确这些参数是由源代码本身传递给访问器的。
  • 更具体地说,您可以将第二个 sn-p 更改为使用 d3.max(data, function(current, index, array) {
【解决方案2】:

f 是一个回调函数。我们一直在 JavaScript 中使用回调。所以这个函数的工作方式与标准数组上的 map 或 forEach 方法相同。它还具有相同的值、索引和数组的调用签名。

d3.min([1,2,3], (v,i,arr)=>10-v ) // 7
d3.min([1,2,3]) //1

当我们像上面那样使用“回调”调用 min 函数时,答案是该数组中的第三项,但给出的答案是 7(因为 10 - 3 是 7)

【讨论】:

  • d3.array.min 会给你Uncaught TypeError。请改用d3.min
【解决方案3】:

添加一个f函数来查找数组的最小值,而这个最小值是>= 6

    	var array = [10, 2, 3, 4, 5];
      // find the minimum while >= 6
      var f = function(x, y, z) {
          if (x >= 6) {
              return x;
          }
      }
      var min = d3.min(array, f);
        
      console.log(min);
<script src="https://cdnjs.cloudflare.com/ajax/libs/d3/3.4.11/d3.min.js"></script>

【讨论】:

  • 如何回答这个问题?这最多是一个后续。
  • 感谢@altocumulus,所有问题都已在上面的答案中得到了很好的回答,在这里我只想分享另一个f 函数示例,它在d3.array.min 上提供了一个有意义的条件,因为我做到了求例子。
猜你喜欢
  • 1970-01-01
  • 2012-09-07
  • 2017-10-16
  • 1970-01-01
  • 2020-12-28
  • 2011-07-27
  • 1970-01-01
  • 2012-10-20
  • 1970-01-01
相关资源
最近更新 更多