前言
想必小伙伴们对reduce应该不会陌生吧,这是ES5新增的处理数组的方法,不过虽然说是处理数组的方法,但它可并不是仅仅局限在数组上而已,下面一起来学习一下吧!
语法
arr.reduce(callback(accumulator, currentValue[, index[, array]])[, initialValue])
reduce方法接收两个参数,第一个参数是reducer回调函数,第二个参数是initialValue初始值; 回调函数 中接收四个参数:
- Accumulator (acc):MDN称作是"累计器";我理解着,感觉它就是我们的目前的一个当前元素值。(目前说明什么呢,说明它是可变的)
- Currentvalue (cur):这个不用多说,指的就是当前被执行的元素。
- Current Index (idx):这个呢,就指的是当前被执行元素的下标,也就是索引值。
- Source Array (src):这个可以理解成,调用reduce方法的数据源(不单单只是数组哦,它可以是各种类型的值)。
我们平时多数使用到的是前两个参数,这两个是必传的,后两个是选填。 initialValue:这是一个可选的初始值。作为第一次调用回调函数时传给Accumulator的值。 这里要注意的是,如果没有提供
initialValue,reduce 会从索引1的地方开始执行 callback 方法,跳过第一个索引。如果提供initialValue,从索引0开始。 基本概念介绍完之后,接下来我们看看reduce,究竟有何妙用?
用法
先来一起看一个经典例子数组求和。
// 片段1:
var total = [1, 2, 3].reduce( (accumulator, current) => {
return accumulator + current;
});
// 片段2
var total = [1, 2, 3].reduce( (accumulator, current) => {
return accumulator + current;
}, 10);
这里各自输出的是什么呢,稍加思索,可能就知道答案了,片段1:输出的是6,片段2:输出的16;这就是有没有初始值initialValue的区别,如果存在,就会把这个值当作第一个值传到accumulator进行计算;如果没有传入初始值,就会从左到右依次取值,进行计算。
有一点建议大家,在使用reduce这个方法时,尽量给上默认初始值,保证程序代码的顺利执行,尤其是在使用数组对象进行reduce调用的时候,不给默认值很容易出现一些不可预期的问题,感兴趣的小伙伴可以继续看下边这段代码片段。
var maxCallback = ( acc, cur ) => Math.max( acc.x, cur.x );
[ { x: 2 }, { x: 22 }, { x: 42 } ].reduce( maxCallback );
这里会输出什么?答案是:NaN,小伙伴们可以先想一想为啥会是NaN呢,也可以下方留言一起讨论~明天我会把我的理解更新到reduce进阶(下)里边,感兴趣的小伙伴可以先关注哦。
结语
前端漫漫长途,我们都在路上,希望可以和小伙伴们一起交流,一起进步。持续更新ing.....