之前对reduce()一直不理解,今天专门看了一遍MDN文档感觉明白了一些。在此记录一下自己的一些理解。
Array.prototype.reduce()方法的作用:
对数组中的每个元素执行一次传入的回调函数(按索引升序执行),并将结果汇总为单个值。
小例子感受一下reduce()的作用:求数组元素的和
var arr = [1, 2, 3];
var result = arr.reduce(function(accumulator, currentValue){
return accumulator + currentValue;
});
console.log(result); //6
完整的语法形式:
array.reduce(callback(accumulator, currentValue[, index][, array])[, initialValue]);
方法接收两个参数,第一个是一个回调函数,该回调函数接受四个参数,第二是一个初始值。我们先看只有必选参数,也就是最简单的版本。
最简单的版本:只传入回调函数必选参数,不传入第二个参数
array.reduce(callback(accumulator, currentValue))
callback:对数组中所有元素都执行一次的回调函数。它有两个必选参数:
accumulator
:累计器,作用是累计回调函数的返回值。第一次调用时,它的值是数组中第一个元素的值。在之后的每一次调用中它的值是上一次调用回调函数返回的值。
currentValue
:数组正在处理的元素。从索引为1的元素开始,因为索引为0的元素被赋给accumulator了。
这里引用MDN中的一段话,个人感觉对理解accumulator的作用很有帮助
回调函数的返回值分配给第一个参数accumulator,该返回值在数组的每次迭代中被记住,并最后成为最终的单个结果值。
通过一个字符串拼接案例,理解函数的执行过程。
var array = ['A', 'B', 'C', 'D'];
var result = array.reduce(function(acc, cur) {
console.log('累计器的值: ' + acc, ' 当前元素: ' + cur, '本次返回值:' + (acc + cur));
return acc + cur;
});
console.log('返回结果:' + result);
执行结果:
可以看出:
(1)accumulator的执行一开始是数组中第一个元素的值,之后就变成上一次调用回调函数的返回值。
(2)最终的返回结果即为最后一次调用回调函数的返回值。
最完整的版本:传入回调函数所有参数和第二个参数:
array.reduce(callback(accumlator, currentValue, index, array), initalValue)
accumulator
:第一次调用时的值不再是数组第一个元素的值,而是initialValue的值。第一次调用之后与之前相同,是上一次调用回调函数返回的值。
currentValue
:不再从索引为1的数组元素开始,而是从索引为0的数组元素开始。
index
:正在的处理数组元素的索引,即currentValue的索引
array
:调用reduce()方法的源数组
initialValue:作为第一次调用callback函数时的第一个参数的值,如果没有提供,则将使用数组中的第一个元素。
还是刚才的字符串拼接案例,传入initialValue为’a’:
var array = ['A', 'B', 'C', 'D'];
var result = array.reduce(function(acc, cur, idx, src) {
console.log('累计器的值: ' + acc, ' 当前元素: ' + cur, '当前元素索引:' + idx + ' 源数组:' + src + ' 本次返回值:' + (acc + cur));
return acc + cur;
}, 'a');
console.log('返回结果:' + result);
执行结果:
可以看出与之前版本的区别:
(1)第一次调用回调函数时,accumulator的值变为传入的initialValue。
(2)currentValue从数组的第一个元素开始。
引用文档:https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Array/Reduce