理解Array.prototype.reduce()的执行过程

之前对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

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值