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);
所以在上面的例子中,
有人可以帮助我理解这个功能吗?
答案 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