initialValue如何在javascript中减少函数?

时间:2018-01-17 01:51:55

标签: javascript

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

  

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

然后 说这个 ......这些不是说不同的东西吗?谢谢!

  

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

3 个答案:

答案 0 :(得分:8)

措辞有点令人困惑,我同意。

将两个陈述放在一起:

  

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

     

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

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

  1. 用作初始值的默认值
  2. 操作将使用的起始数组索引
  3. 这个措辞是否更有意义?:

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

答案 1 :(得分:3)

不幸的是,我不能只是添加评论。请试试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会很有用。

答案 2 :(得分:0)

简而言之:[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 实际上是计算的第一个中间结果