JavaScript中的Array.prototype.reduce函数

时间:2017-10-18 20:44:19

标签: javascript function reduce

var arr = [1,2,3];
var max = arr.reduce(function(a, b) {
return Math.max(a, b);
});

我正在浏览MDN docs REDUCE函数,在上面的代码片段中,我只想知道函数(a,b)做了什么。如何运作将像

一样
function (1,2)
{

}

function(2,3)
{

}

function(3,1)
{

}

我还发现了另外一个例子,它总结了数组中的所有元素

var numbers = [0, 1, 2, 3];
var result = numbers.reduce(function(accumulator, currentValue) {
    return accumulator + currentValue;
},0);


console.log(result);

所以在上面的例子中,

  1. 函数如何立即知道它的第一个参数是累加器??
  2. 在第一次迭代中,累加器和当前值的值是什么(我假设函数(0,1))
  3. 如果我不给出初始值(此处为0)会发生什么。这个初始值是否会在第一次迭代中存储到累加器中?
  4. 有人可以帮助我理解这个功能吗?

2 个答案:

答案 0 :(得分:2)

  

函数如何立即知道它的第一个参数是累加器

编写函数(即你)的人有责任编写一个函数,该函数期望第一个参数是累加器。

正如您提到的MDN文档所说,reduce函数将作为第一个参数传递。

  

在第一次迭代中,累加器和当前值的值是什么

正如文档所说,第一次调用它时,累加器将被设置为initialValue,如果你没有另外指定,它将是数组中的第一个元素。

同样,当前值将是数组中正在处理的当前值。

  

如果我不给出初始值(此处为0)

,会发生什么

引用您引用的文档:如果未提供初始值,则将使用数组中的第一个元素。

答案 1 :(得分:0)

好的,我认为你在概念上错过了一步。在MDN上的文档中,您将注意到传递给reducer函数的回调函数最多可以接受4个参数(累加器,当前值,当前索引,最初调用的数组reduce)。通常,您将在回调函数中仅使用累加器和当前值参数来查看reducer。累加器是先前迭代的累积结果,当前值是reducer当前迭代的索引处的值。

```

// ES6
const reducer = (accumulator, currentValue) => Math.max(accumulator, currentValue);

// OR OLDER
const reducer = function(accumulator, currentValue) {
  // return whichever is higher 
  return Math.max(accumulator, currentValue);
}
const arr = [1,2,3];
let result = arr.reduce(reducer, 0);
// (0, 1) -> (1, 2) -> (2, 3) -> result = 3;
// more interesting
const arr_2 = [5, 1, 6, 7, 4, 9, 2, 8];
let result_2 = arr_2.reduce(reducer, 0);
// (0, 5)->(5,1)->(5,6)->(6,7)->(7,4)->(7,9)->(9,2)->(9,8)->result = 9

reducer回调是一个比较器函数,它根据累计值和当前数组索引执行评估,然后返回结果。

array.prototype.reduce使用此回调函数和可选的基值(在我的示例中为0)将数组的内容减少到单个值。

例如,如果您想要在数组中添加所有数字,那么您将:

const arr = [1,2,3];
let result = arr.reduce((acc, cur) => cur + acc, 0);
// (0, 1) -> (1, 2) -> (3, 3) -> result = 6