前言
reduce作为ES5新增的常规数组方法之一,对比forEach、filter和map,在实际使用上好像有些被忽略,发现身边的人极少使用它,导致这个如此强大的方法被逐渐埋没。
如果经常使用reduce,怎么可能放过如此好用的它呢!我还是得把他从尘土中取出来擦干净,奉上它的高级用法给大家。一个如此好用的方法不应该被大众埋没。
下面对reduce的语法进行简单说明
- 定义:对数组中的每个元素执行一个自定义的累计器,将其结果汇总为单个返回值
- 形式:array.reduce((t, v, i, a) => {}, initValue)
参数
- callback:回调函数(必选)
- initValue:初始值(可选)
回调函数的参数
- total(t):累计器完成计算的返回值(必选)
- value(v):当前元素(必选)
- index(i):当前元素的索引(可选)
- array(a):当前元素所属的数组对象(可选)
过程
- 以t作为累计结果的初始值,不设置t则以数组第一个元素为初始值
- 开始遍历,使用累计器处理v,将v的映射结果累计到t上,结束此次循环,返回t
- 进入下一次循环,重复上述操作,直至数组最后一个元素
- 结束遍历,返回最终的t
reduce的精华所在是将累计器逐个作用于数组成员上,把上一次输出的值作为下一次输入的值。下面举个简单的栗子,看看reduce的计算结果。
1 | const arr = [3, 5, 1, 4, 2]; |
reduce实质上是一个累计器函数,通过用户自定义的累计器对数组成员进行自定义累计,得出一个由累计器生成的值。另外reduce还有一个胞弟reduceRight,两个方法的功能其实是一样的,只不过reduce是升序执行,reduceRight是降序执行。
对空数组调用reduce()和reduceRight()是不会执行其回调函数的,可认为reduce()对空数组无效
高级用法
单凭以上一个简单栗子不足以说明reduce是个什么。为了展示reduce的魅力,我为大家提供25种场景来应用reduce的高级用法。有部分高级用法可能需要结合其他方法来实现,这样为reduce的多元化提供了更多的可能性。
部分示例代码的写法可能有些骚,看得不习惯可自行整理成自己的习惯写法
累加累乘
1 | function Accumulation(...vals) { |
权重求和
1 | const scores = [ |
代替reverse
1 | function Reverse(arr = []) { |
代替map和filter
1 | const arr = [0, 1, 2, 3]; |
代替some和every
1 | const scores = [ |
数组分割
1 | // size分割份数 |
数组过滤
1 | function Difference(arr = [], oarr = []) { |
数组填充
1 | function Fill(arr = [], val = "", start = 0, end = arr.length) { |
数组扁平
1 | function Flat(arr = []) { |
数组去重
1 | function Unique(arr = []) { |
数组最大最小值
1 | function Max(arr = []) { |
数组成员独立拆解
1 | function Unzip(arr = []) { |
数组成员个数统计
1 | function Count(arr = []) { |
数组成员位置记录
1 | function Position(arr = [], val) { |
数组成员特性分组
1 | function Group(arr = [], key) { |
数组成员所含关键字
1 | function Keyword(arr = [], keys = []) { |
字符串翻转
1 | function ReverseStr(str = "") { |
数字千分化
1 | function ThousandNum(num = 0) { |
异步累计
1 | async function AsyncTotal(arr = []) { |
斐波那契数列
1 | function Fibonacci(len = 2) { |
URL参数反序列化
1 | function ParseUrlSearch() { |
URL参数序列化
1 | function StringifyUrlSearch(search = {}) { |
返回对象指定键值
1 | function GetKeys(obj = {}, keys = []) { |
数组转对象
1 | const people = [ |
Redux Compose函数原理
1 | function Compose(...funs) { |
兼容和性能
好用是挺好用的,但是兼容性如何呢?在Caniuse上搜索一番,兼容性绝对的好,可大胆在任何项目上使用。不要吝啬你的想象力,尽情发挥reduce的compose技能啦。对于时常做一些累计的功能,reduce绝对是首选方法。