【问题标题】:how does initialValue work in javascript reduce function?initialValue 如何在 javascript reduce 函数中工作?
【发布时间】:2018-01-17 01:51:54
【问题描述】:

我确定我读错了,但 MDN 这么说...

初始值
用作回调第一次调用的第一个参数的值。如果未提供初始值,则将使用数组中的第一个元素。在没有初始值的空数组上调用 reduce() 是错误的。

那么 这样说...这些不是说不同的东西吗?谢谢!

如果没有提供 initialValue,reduce() 将从索引 1 开始执行回调函数,跳过第一个索引。如果提供了 initialValue,它将从索引 0 开始。

【问题讨论】:

    标签: javascript


    【解决方案1】:

    我同意,措辞有点混乱。

    将两个语句放在一起:

    如果没有提供初始值,则数组中的第一个元素将 被使用

    如果没有提供 initialValue,reduce() 将执行回调 函数从索引 1 开始,跳过第一个索引

    这两个语句实际上是在描述没有提供初始值时reduce操作的两个不同特征:

    1. 用作初始值的默认值
    2. 操作将使用的起始数组索引

    这个措辞是否更有意义?:

    如果没有提供初始值,则将第一个元素用作初始值。在这种情况下,回调函数将从索引 1 开始,因为索引 0 已经通过使用它的值作为默认起始值​​来计算。

    【讨论】:

    • 是的..这完全清除了它。我知道我只是没读对。非常感谢!
    • 啊!我错过了文档后面的行“如果未提供 initialValue,reduce() 将从索引 1 开始执行回调函数”。谢谢乔纳森!
    【解决方案2】:

    很遗憾,我不能只添加评论。请尝试this。这是对 .reduce() 函数的另一种解释,并举例说明了它如何在http://javascript.info 上工作。或许,它会帮助您更好地理解这一点。

    另外,here 是您在另一个 StackOverflow 的讨论中关于没有初始值的空数组异常的问题的答案。

    如果没有提供 initialValue,那么 previousValue 将等于 数组中的第一个值和 currentValue 将等于 第二。如果数组不包含任何元素,则为 TypeError 未提供 initialValue。

    更新:freeCodeCamp 上的这篇文章 How JavaScript’s Reduce method works, when to use it, and some of the cool things it can do 可能会有用。

    【讨论】:

    • Provide context for links > 鼓励链接到外部资源,但请在链接周围添加上下文,以便您的其他用户了解它是什么以及为什么存在。始终引用重要链接中最相关的部分,以防目标站点无法访问或永久离线。
    • 谢谢。我添加了一些细节。希望,现在好多了。
    【解决方案3】:

    简而言之:[a,b,c].reduce(...)[b,c].reduce(..., a) 有时是同一个东西。更好的思考方式是,initialValue 实际上是您计算的第一个中间结果。

    reduce 的基本工作

    要更好地了解 reduce 的工作原理,请使用以下 sum(a,b) 函数,该函数会为它执行的每个操作记录类似 a+b=c 的文本。

    function sum(a,b) { 
      const c = a + b;
      console.log(`${a} + ${b} => ${c}`)
      return c;
    }
    
    const arr = [1,2,4,8];
    const result = arr.reduce(sum);
    console.log(`result=${result}`)

    这会打印出1+2=33+4=77+8=15,最后是result=15

    角落案例:1 个元素

    const arr = [1];
    const result= arr.reduce(sum);
    console.log(`result=${result}`)
    

    如果数组中只有一个元素。然后它甚至根本不会调用提供的函数。 它只会返回单个元素。所以在这种情况下,它只会打印result=1

    角落案例:0 个元素

    const arr = [];
    const result = arr.reduce(sum);
    console.log(`result=${result}`)
    

    如果没有元素也没有初始值,那么它只会抛出一个错误:Uncaught TypeError: Reduce of empty array with no initial value

    如何准备空数组:

    当然你可以在你的代码中添加一个检查来检查你的数组的length

    一个非常可靠的解决方法是在数组前面添加一个初始值。

    const arr = [];
    const arr2 = [0, ...arr];
    const result = arr2.reduce(sum)
    

    initialValue 参数提供了更好的解决方案。很容易说initialValue 实际上做了同样的事情。那是不正确的。

    const result = arr.reduce(sum, 0);
    

    然而,在本示例的上下文中,两者都导致相同的结果。然而,实际上initialValue并不是一个输入值,而更像是初始总和。

    使用对象:

    只有当您开始使用reduce 进行更复杂的转换时,才会有一个小的区别。

    const inputs = [{value: 1}, {value: 2}, {value:3}];
    const total = inputs.reduce((sum, input) => sum + input.value, 0);
    

    上面的示例再次创建了一个总计,但这次它从属性value 中提取输入。我们有一个对象的输入和一个数字结果。在这种示例中,initialValue 根本不是可选的。这是强制性的。

    想想如果在这个例子中没有initialValue 会发生什么。 sum 在第一次迭代中的值是多少? sum 实际上是 {value: 1},它甚至不是一个数字。

    因此,在此示例中,很明显 initialValue 实际上是您计算的第一个中间结果

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-07-01
      • 2021-12-14
      • 1970-01-01
      • 1970-01-01
      • 2020-07-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多