(一)reduce的作用

1 . 数组求和,求乘积
2 . 计算数组中每个元素出现的次数
3 . 数组去重
4 . 数组扁平化(将二维,或者多维数组转化为一维数组)
等等等等…基本上数组方法能做的事情,reduce都能做

大部分现代的数组方法都返回一个新的数组,而 Array.reduce() 更加灵活。它可以返回任意值,它的功能就是将一个数组的内容聚合成单个值。这个值可以是数字、字符串,甚至可以是对象或新数组

(二)reduce的参数

reduce的参数,只接收两个参数,1. 回调函数(必填)2. initValue 初始值(非必填)
注意:回调函数有四个参数

对空数组调用reduce()和reduceRight()是不会执行其回调函数的,可认为reduce()对空数组无效

1 . Accumulator (累计器),上一次回调函数的返回值,如果有initValue,他就表示为initValue的值
2 . Current Value 当前正在处理的数组元素
3 . Current Index 当前正在处理的数组元素的索引,如果提供了initValue ,则索引值为0,否则索引值为1
4 . Source Array 源数组

const numArr = [1, 2, 3, 4, 5]
const sum = numArr.reduce(function (accumulator, currentValue, currentIndex, array) {console.log(accumulator, currentValue)return accumulator + currentValue;
})
// 这里因为没有init值,所以输出,1 2(没有init时,循环 length - 1 次)
const numArr = [1, 2, 3, 4, 5]
const sum = numArr.reduce(function (accumulator, currentValue, currentIndex, array) {console.log(accumulator, currentValue)return accumulator + currentValue;
}, 5)
// 这里因为有init值,所以输出,5 1(有init时,循环 length 次)

(三)利用reduce,求数组内所有元素的和,积 ,最大值,最小值

求和

const numArr = [1, 2, 3, 4, 5]
const sum = numArr.reduce((pre, cur, index, arr) => {return pre + cur
})// 封装成函数
function Accumulation(val) {return val.reduce((pre, cur) => pre + cur);
}
console.log(Accumulation(numArr)) // 15

求积(跟求和一样,就是把 + 换成 *

const numArr = [1, 2, 3, 4, 5]
const sum = numArr.reduce((pre, cur, index, arr) => {return pre * cur
})// 封装成函数
function Multiplication(val) {return val.reduce((pre, cur) => pre * cur);
}
console.log(Multiplication(numArr)) // 120

求最大值

const numArr = [12, 45, 21, 65, 38, 76, 108, 43];function maxNum(arr = []) {return arr.reduce((pre, cur) => pre > cur ? pre : cur)
}

求最小值

const numArr = [12, 45, 21, 65, 38, 76, 108, 43];function maxNum(arr = []) {return arr.reduce((pre, cur) => pre < cur ? pre : cur)
}

(四)利用reduce,计算数组中每个元素出现的次数

const nameArr = ['佩可莉姆', '可可萝', '凯露', '可可萝', '真步', '佩可莉姆', '可可萝']
// 设置一个初始值,init为空对象{}
const sum = nameArr.reduce((pre, cur, index, arr) => {// 如果:当前值在上次的返回值中,则让他的value值++// pre[cur] 相当于 obj.key if (cur in pre) {pre[cur]++}// 否则: pre[cur] = 1 的意思类比于 obj.key = value// 因为这是 else 的值,这个 key,肯定不在这个对象中,如果一个对象的不存在这个 key ,我们又用obj.key的形式声明// 则会直接给该对象添加属性,并赋值else {pre[cur] = 1}return pre;
}, {})
// { 佩可莉姆: 2, 可可萝: 3, 凯露: 1, 真步: 1 }// 封装成函数
function Count(arr = []) {return arr.reduce((pre, cur) => (pre[cur] = (pre[cur] || 0) + 1, pre), {});
}

如果你看不懂封装成函数的这段代码,下面是解释

1 . 逗号表达式(逗号运算符)逗号运算符是二元运算符,它能够先执行运算符左侧的操作数,然后再执行右侧的操作数,最后返回最右侧操作数的值。
举个例子:
与条件运算符、逻辑运算符根据条件来决定是否执行所有或特定操作数不同,逗号运算符会执行所有的操作数,但不会返回所有操作数的结果,它只返回最后一个操作数的值。(也就是例子中的 x * 8)

const exampleNum = (x = 5 + 3, x = x - 4, x * 8)
console.log(exampleNum) // 32
const nameArr = ['佩可莉姆', '可可萝', '凯露', '可可萝', '真步', '佩可莉姆', '可可萝']
// 封装成函数
function Count(arr = []) {// 第一次循环 pre = {},cur = '佩可莉姆'// 第二次循环 pre = { '佩可莉姆':1 } , cur = '可可萝'// 第三次循环同理 结束时 pre = { '佩可莉姆':1 , '可可萝':1, '凯露':1}// 第四次循环 开始时 pre = { '佩可莉姆':1 , '可可萝':1, '凯露':1}return arr.reduce((pre, cur) => (// 第一次循环 {}.佩可莉姆 = {}.佩可莉姆 || 0 因为此时,{}.佩可莉姆 = undefined 所以这里 = 0 + 1// 然后返回 pre 也就是 { '佩可莉姆':1 }// 第二次循环 { '佩可莉姆':1 }.可可萝 = { '佩可莉姆':1 }.可可萝 || 0,同理 { '佩可莉姆':1 }.可可萝 = undefined,所以这里 = 0 + 1// 然后返回 pre 也就是 { '佩可莉姆':1 , '可可萝':1}// 第四次循环 { '佩可莉姆':1 , '可可萝':1, '凯露':1}.可可萝 = { '佩可莉姆':1 , '可可萝':1, '凯露':1}.可可萝 || 0 ,// 这时 { '佩可莉姆':1 , '可可萝':1, '凯露':1}.可可萝 = 1 已经有值了,不会走||运算了,之后再 + 1 // 然后返回 pre 也就是 { '佩可莉姆':1 , '可可萝':2, '凯露':1 }pre[cur] = (pre[cur] || 0) + 1, pre), {});
}

(五)数组扁平化

Array.concat()可以传入数组,也可以传入值
(数组扁平化Array.flat(Infinity)数组自带扁平化的方法,但是兼容性不太好,IE浏览器更是一点都不兼容,但是新版本的IE(Edge)却可以完美支持)

const numArr = [1, [2, [3, [4, [5]]]], 6]const newArr = (arr) => {return arr.reduce((pre, cur) => {return pre.concat(Array.isArray(cur) ? newArr(cur) : cur)}, [])
}// 封装成函数
function myFlat(arr = []) {return arr.reduce((pre, cur) => pre.concat(Array.isArray(cur) ? myFlat(cur) : cur), [])
}

(六)数组去重

const nameArr = ['佩可莉姆', '可可萝', '凯露', '可可萝', '真步', '佩可莉姆', '可可萝']function myUnique(arr = []) {return arr.reduce((pre, cur) => pre.includes(cur) ? pre : [...pre, cur], [])
}

(七)数组对象去重

const arrObj = [{ name: '小明' }, { name: '小红' }, { name: '小兰' }, { name: '小明' }, { name: '小兰' }];
// 定义一个空对象,用来保存第一次循环的对象的值,第二次时啥也不处理处理
const obj = {};
const newArr = arrObj.reduce((pre, cur, index) => {// 将需要去重的字段值作为obj的key,判断obj上是否存在这个key的值,如【小明】这个key,存在则啥也不干,跳过这次循环// 进入下次循环,否则,将这个key值设置为true,如obj.小明=true,同时,将这个值push给pre最后返回obj[cur.name] ? '' : (obj[cur.name] = true && pre.push(cur));return pre;
}, []);

(八)斐波那契数列

存在一个问题,输入小于2的数,都会返回 [0,1],这个问题可以根据自己的情况修改

function myFibonacci(time = 2) {const Arr = [...new Array(time).keys()]return Arr.reduce((pre, cur, index) => {index > 1 && pre.push(pre[index - 1] + pre[index - 2])return pre}, [0, 1])
}
console.log(myFibonacci(1)) // [0, 1]
console.log(myFibonacci(2)) // [0, 1]
console.log(myFibonacci(10)) // [0, 1, 1, 2, 3, 5, 8, 13, 21, 34]

数组 reduce 简介及使用场景相关推荐

  1. [vue] 分别说说vue能监听到数组或对象变化的场景,还有哪些场景是监听不到的?无法监听时有什么解决方案?

    [vue] 分别说说vue能监听到数组或对象变化的场景,还有哪些场景是监听不到的?无法监听时有什么解决方案? 无法监听时的方案: 数组:改变数组的值:this.$set() 改变数组长度:arr.sp ...

  2. 经济型EtherCAT运动控制器(一):功能简介与应用场景

    XPLC006E功能简介 XPLC006E是正运动运动控制器推出的一款多轴经济型EtherCAT总线运动控制器,XPLC系列运动控制器可应用于各种需要脱机或联机运行的场合. XPLC006E自带6个电 ...

  3. JS数组reduce的25个高级用法

    reduce作为ES5新增的常规数组方法之一,对比forEach .filter和map,在实际使用上好像有些被忽略,下面这篇文章主要给大家介绍了关于JS数组reduce你不得不知道的25个高级用法, ...

  4. 20个你不得不知道的数组reduce高级用法

    目录 1 背景 2 高级用法 3 兼容和性能 4 结语 1 背景 reduce 作为ES5新增的常规数组方法之一,对比 forEach .filter 和 map,在实际使用上好像有些被忽略,发现身边 ...

  5. JS进阶篇--JS数组reduce()方法详解及高级技巧

    基本概念 reduce() 方法接收一个函数作为累加器(accumulator),数组中的每个值(从左到右)开始缩减,最终为一个值. reduce 为数组中的每一个元素依次执行回调函数,不包括数组中被 ...

  6. kafka入门:简介、使用场景、设计原理、主要配置及集群搭建

    为什么80%的码农都做不了架构师?>>>    kafka入门:简介.使用场景.设计原理.主要配置及集群搭建(转) 问题导读: 1.zookeeper在kafka的作用是什么? 2. ...

  7. DL:深度学习模型概览(包括DNN、CNN、RNN等)的简介、网络结构简介、使用场景对比之详细攻略

    DL:神经网络所有模型(包括DNN.CNN.RNN等)的简介(概览).网络结构简介.使用场景对比之详细攻略 目录 神经网络所有模型的简介及其总结 神经网络所有模型的简介(概览) 神经网络算法之DNN. ...

  8. JS进阶篇--JS数组reduce()方法详解及高级技巧 1

    基本概念 reduce() 方法接收一个函数作为累加器(accumulator),数组中的每个值(从左到右)开始缩减,最终为一个值. reduce 为数组中的每一个元素依次执行回调函数,不包括数组中被 ...

  9. 比较完善的手写数组reduce方法

    手写数组reduce方法 看过其他的文章, 感觉他们实现的reduce方法不够完善, 分享一下自己写的比较完善的reduce方法, 如果错误的地方, 请留言给我 Array.prototype.new ...

最新文章

  1. 干货 | 20个教程,掌握时间序列的特征分析(附代码)
  2. window 桌面开发_C#桌面开发的未来WebWindow
  3. 0.0 目录-深度学习第一课《神经网络与深度学习》-Stanford吴恩达教授
  4. Android服务之Service(其一)
  5. var_export
  6. Linux——VMware虚拟机安装CentOS步骤
  7. 分割字符串,字符串去除空格
  8. JavaScript实现斐波那契数列(Febonacci Array)
  9. 腾讯手机QQ更新:最想要的功能终于实现了!
  10. 关于Mytatis动态拼接in语句并且按照指定顺序排序的问题
  11. 根据用户查进程_Linux进程之如何查看进程详情?
  12. java某些基础知识点整理
  13. 基于java的药品管理系统_基于Java药品管理系统
  14. 简单工厂模式-实现简易计算器
  15. Cilium 官方文档翻译(7) IPAM Kubernetes Host模式
  16. HTML 关于p标签的嵌套问题
  17. Linux C/C++ 获取系统时间
  18. 微擎+微赞(微官网)100套精华模板完美完整版
  19. 2021年最新React状态管理解决方案
  20. 解决论文写作排版中,两端对齐导致文字间距被word补过大的问题

热门文章

  1. 数据结构与算法(python):图(Graph)的基本概念及应用
  2. 使用Telerik控件搭建Doubanfm频道部分
  3. mysql查询各专业人数_SQL统计各专业学生人数
  4. 磊科路由器dns服务器老要修复,路由器DNS劫持的解决方法
  5. 做电商网站php开发的流程,如何开发电商平台-电商开发第一步
  6. 华为公司软件编程规范
  7. 在xcode上看不到输出: stepping may behave oddly; variables may not be available
  8. 如何提高思维能力和逻辑能力?
  9. smaa github iryoku
  10. Excel VBA自定义功能区