array.reduce()方法中此语法的含义是什么?

时间:2019-04-04 11:14:31

标签: javascript functional-programming

我正在研究一个功能强大的javascript库,并发现了一种采用线性数组平均数的单线。我对语法中包含的某些内容感到困惑,但似乎不需要正确返回结果。

const numArr = [1,2,3,4,5,6,7,8,9,10];

const average = (array) => array.reduce((a, b) => (a + b), 0) / array.length;

Result => 5.5

看似可选的部分是“,/”之前的“,0”。

任何输入将不胜感激。

5 个答案:

答案 0 :(得分:1)

JavaScript array.reduce方法有2个参数,第一个是回调函数,第二个是initialValue,如果我们需要传递其他值,它将作为第一个初始值传递给回调函数,它是{{1} }。如果未定义,则将第一个元素用作初始值。 有关更多信息,请查看此Javascript array reduce

答案 1 :(得分:0)

这里0是初始值,或者有时也称为驴累加器。因此,在reduce回调函数中,a参数的初始值将设置为5。在此演示中,传递{5而不是0并检查第一个日志。它将打印5。因此,无论您通过什么,都将使用a的初始值。第二个日志将是initial value + first element in the array,即5+1=6。现在初始值将更改为6,第三个日志将为6+2=8,依此类推

const numArr = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];

const average = (array) => array.reduce((a, b) => {
  console.log(a)
  return (a + b);
}, 5) / array.length;

console.log(average(numArr))

答案 2 :(得分:0)

所示的average函数可以分为两部分,其中只有第一部分与回答问题有关。

第一部分创建数组内所有数字的总和:

array.reduce((a, b) => (a + b), 0)

实际上,这里不需要结尾, 0)部分,因为reduce 都在等待起始值(此处为0)或它开始数组中的第一个元素作为种子值。我个人认为,添加, 0)部分可以使缩进的含义更加清楚:将所有从零开始的数字相加。

通过查看该行,在reducer函数内部有一个不必要的分组运算符。因此,可以这样重写:

array.reduce((a, b) => a + b, 0)

或者,如果您具有add函数(例如const add = (a, b) => a + b):

array.reduce(add, 0)

没有种子值,我们得出最短形式:

array.reduce(add)

答案 3 :(得分:0)

为此,我们首先了解reducer函数:

Arr.reduce((accumulator, currentValue) => (/* do something with the parameters */), initialValue);

这里:

累加器:累加器累积回调的返回值

currentValue :数组中正在处理的当前元素。

initialValue :用作首次调用回调的第一个参数的值。

第一次调用回调时,accumulatorcurrentValue可以是两个值之一。如果在对initialValue的调用中提供了reduce(),则累加器将等于initialValue,并且currentValue将等于数组中的第一个值。如果没有提供initialValue,则accumulator将等于数组中的第一个值,而currentValue将等于第二个值。

您可以阅读更多here in the documentation from MDN

答案 4 :(得分:0)

According to Mozilla's documentation,第二个参数是初始值:

arr.reduce(callback[, initialValue])

要回答您的问题:为什么要这样做?

需要考虑零长度数组,并避免出现异常。如果省略第二个参数,则如果数组中的元素为零,则会出现异常,如下所示:

const numArr = [];

const average = (array) => array.reduce((a, b) => (a + b)) / array.length;

console.log(average(numArr));

另一方面,如果您添加初始值:

const numArr = [];

const average = (array) => array.reduce((a, b) => (a + b), 0) / array.length;

console.log(average(numArr));

在这种情况下,您有一个NaN,因为最后会有0 / 0,这会在JavaScript中产生NaN。但是至少您没有任何例外:)。