好的设计能够促使观看者希望了解更多。——<亚历山大·伊斯里>
Array.prototype.reduce()
reduce()
方法对数组中每个元素执行一个由您提供的 reducer
函数(升序执行),将其结果汇总为单个返回值。
1 | const array1 = [1, 2, 3, 4]; |
reducer
函数接收4个参数:
- 累加器(acc)(累计器)
- Current Value (cur) (当前值)
- 当前索引 (idx) (当前索引)
- 源数组(src)(源数组)
你的 减速器 函数的返回值分配给累积器,该返回值在数组的每个迭代中被计算出来,并最终成为最终的单个值。
语法
1 | arr.reduce(callback(accumulator, currentValue[, index[, array]])[, initialValue]) |
普通用法 (累加,关联)
1 | // 当前的购物清单 |
reduce
函数可选的参数在第一个例子里是基本变量数字 0
,但是它也可以是一个对象,数组… 而不仅是基本类型,之后我们将会看到。
现在,我们收到一个20$的优惠券。
1 | var total = items.reduce(reducer,-20); |
进阶用法(结合)
第二种用法的例子是 Redux
的 combineReducers
函数源码里用到的。
此创意是将 reducer
函数拆分为独立的函数,最后组合成一个新的单一的大 reducer
函数。
为了说明,我们创建一个单一的对象,包含一些可以计算不同货币($, €…)的总价值的 reducer
函数。
1 | var reducers = { |
然后我们建立一个 reduce
函数
- 能够调用每一部分的
reduce
函数 - 返回一个新的
reducer
回调函数
1 | var combineTotalPriceReducers = function(reducers) { |
现在,我们来看一下如何使用它。
1 | var bigTotalPriceReducer = combineTotalPriceReducers(reducers); |
我希望这种方法可以使你在自己的需求内使用 reduce()
函数时有新的想法。
使用 reduce
函数也可以实现保存每一次计算结果的功能。这在 Ramdajs
里的 scan
函数已经实现了。
在JSFiddle里运行
https://jsfiddle.net/darul75/81tgt0cd/
参考
- https://www.jstips.co/zh_cn/javascript/reminders-about-reduce-function-usage/
- MDN - https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/Reduce
关注【公众号】,了解更多。
赞赏一下 坚持原创技术分享,您的支持将鼓励我继续创作!