怎样`reduce()`数组
文档里说reduce()
方法接收一个函数作为累加器(accumulator),数组中的每个值(从左到右)开始合并,最终为一个值。
reduce()
reduce() 函数接收2个参数(M: 必填, O: 可选):
- (M) 回调reducer 函数 处理先前的结算结果和下一个元素直到序列结束。
- (O) 初值 作为第一次调用回调时的第一个参数。
所以,让我们先看一个普通用法,之后再看一个复杂用法。
普通用法 (累加,关联)
我们正在逛亚马逊(单价为美元$) 我们的购物车实在太满了,我们来计算一下总价吧:
1 | // 当前的购物清单 |
reduce
函数可选的参数在第一个例子里是基本变量数字0,但是它也可以是一个对象,数组… 而不仅是基本类型,之后我们将会看到。
现在,我们收到一个20$的优惠券。
1 | var total = items.reduce(reducer,-20); |
进阶用法(结合)
第二种用法的例子是Redux
的combineReducers函数源码里用到的。
此创意是将reducer
函数拆分为独立的函数,最后组合成一个新的单一的大reducer
函数。
为了说明,我们创建一个单一的对象,包含一些可以计算不同货币($, €…)的总价值的reducer
函数。
1 | var reducers = { |
然后我们建立一个瑞士军刀函数
- 能够调用每一部分的
reduce
函数 - 返回一个新的
reducer
回调函数
1 | var combineTotalPriceReducers = function(reducers) { |
现在,我们来看一下如何使用它。
1 | var bigTotalPriceReducer = combineTotalPriceReducers(reducers); |
我希望这种方法可以使你在自己的需求内使用reduce()
函数时有新的想法。
使用reduce
函数也可以实现保存每一次计算结果的功能。这在Ramdajs
里的scan函数已经实现了。
原文作者: anhr
原文链接: http://yoursite.com/2019/11/04/javascript/2016-02-17-reminders-about-reduce-function-usage/
版权声明: 转载请注明出处(必须保留原文作者署名原文链接)