8个JS的reduce使用实例和reduce操作方式


Posted in Javascript onOctober 05, 2021

reduce方法是一个数组的迭代方法,和mapfilter不同,reduce方法可缓存一个变量,迭代时我们可以操作这个变量,然后返回它。

这是我大白话的解释,可能还是不容易理解,下面看例子吧

1. 数组累加

数组累加是项目经常遇到的,比如计算商品总价等,使用reduce就可以一行代码搞定,而且不用定义外部变量,reduce是完全无副作用的函数。

// 累加
[1, 2, 3, 4, 5, 6, 7, 8].reduce((a, i) => a + i);
// 输出:36

// 累加,默认一个初始值
[1, 2, 3, 4, 5, 6, 7, 8].reduce((a, i) => a + i, 5);
// 输出:41

// 累乘
[1, 2, 3, 4, 5, 6, 7, 8].reduce((a, i) => a * i);
// 输出:40320

2. 找出数组最大值

在数组每次的迭代中,我们使用Math.max获取最大值并返回,最后我们将得到数组所有项目的最大值。

[1, 2, 3, 4, 5, 6, 7, 8].reduce((a, i) => Math.max(a, i));

当然如果数组每项都是数字我们可以使用...展开运算符和Math.max配合。

Math.max(...[1, 2, 3, 4, 5, 6, 7, 8]);

3. 处理不规则数组

通过mapreduce配合使用,返回每个子数组拼接好的结果。

let data = [
  ["红色","128g", "苹果手机"],
  ["南北","两室一厅","128?","洋房住宅"],
  ["小米","白色","智能运动手表","心率血压血氧","来电信息提醒"], 
  ["官方发售","2020年秋季","篮球","球鞋","品牌直邮"]
]
let dataConcat = data.map(item=>item.reduce((a,i)=>`${a} ${i}`))

// 输出结果:
["红色 128g 苹果手机"
"南北 两室一厅 128? 洋房住宅"
"小米 白色 智能运动手表 心率血压血氧 来电信息提醒"
"官方发售 2020年秋季 篮球 球鞋 品牌直邮"]

4. 删除数据重复项

检查当前迭代项是否存在,如果不存在添加到数组中。

let array = [1, 2, 3, 'a', 'b', 'c', 1, 2, 3, 'a', 'b', 'c'];
array.reduce((noDupes, curVal) => {
  if (noDupes.indexOf(curVal) === -1) { noDupes.push(curVal) }
  return noDupes
}, [])

// 输出:[1, 2, 3, 'a', 'b', 'c']

5. 验证括号是否合法

这是一个很巧妙的用法,我在dev.to上看到的用法。如果结果等于0说明,括号数量是合法的。

[..."(())()(()())"].reduce((a,i)=> i === '(' ? a+1 : a-1 , 0);
// 输出:0

// 使用循环方式
let status=0
for (let i of [..."(())()(()())"]) {
  if(i === "(")
    status = status + 1
  else if(i === ")")
    status = status - 1
  if (status < 0) {
    break;
  }
}

6. 按属性分组

按照指定key将数据进行分组,这里我用国家字段分组,在每次迭代过程中检查当前国家是否存在,如果不存在创建一个数组,将数据插入到数组中。并返回数组。

let obj = [
  {name: '张三', job: '数据分析师', country: '中国'},
  {name: '艾斯', job: '科学家', country: '中国'},
  {name: '雷尔', job: '科学家', country: '美国'},
  {name: '鲍勃', job: '软件工程师', country: '印度'},
]

obj.reduce((group, curP) => {
  let newkey = curP['country']
  if(!group[newkey]){
    group[newkey]=[]
  }
  group[newkey].push(curP)
  return group
}, [])
// 输出:
[ 中国: [{…}, {…}]
  印度: [{…}]
  美国: [{…}] ]

7. 数组扁平化

这里展示的数组只有一级深度,如果数组是多级可以使用递归来进行处理

[[3, 4, 5], [2, 5, 3], [4, 5, 6]].reduce((singleArr, nextArray) => singleArr.concat(nextArray), [])
// 输出:[3, 4, 5, 2, 5, 3, 4, 5, 6]

当然也可以使用ES6的.flat方法替代

[ [3, 4, 5], 
 [2, 5, 3], 
 [4, 5, 6]
].flat();

8. 反转字符串

这也是一种很奇妙的实现方法

[..."hello world"].reduce((a,v) => v+a)

或者

[..."hello world"].reverse().join('')

 

Javascript 相关文章推荐
Google Map API更新实现用户自定义标注坐标
Jul 29 Javascript
js实现的星星评分功能函数
Dec 09 Javascript
JavaScript仿商城实现图片广告轮播实例代码
Feb 06 Javascript
jQuery焦点图轮播插件KinSlideshow用法分析
Jun 08 Javascript
JS+DIV实现的卷帘效果示例
Mar 22 Javascript
详解Angular2中Input和Output用法及示例
May 21 Javascript
浅谈Node.js 中间件模式
Jun 12 Javascript
详解vue使用插槽分发内容slot的用法
Mar 28 Javascript
微信小程序 调用远程接口 给全局数组赋值代码实例
Aug 13 Javascript
js实现多个标题吸顶效果
Jan 08 Javascript
js实现图片上传到服务器和回显
Jan 19 Javascript
Vue+Element UI实现概要小弹窗的全过程
May 30 Vue.js
JS 4个超级实用的小技巧 提升开发效率
Oct 05 #Javascript
JavaScript实现简单拖拽效果
Sep 15 #Javascript
一小时迅速入门Mybatis之bind与多数据源支持 Java API
Sep 15 #Javascript
Javascript之datagrid查询详解
Sep 15 #Javascript
Js类的构建与继承案例详解
Sep 15 #Javascript
JavaScript 数组去重详解
Sep 15 #Javascript
5种方法告诉你如何使JavaScript 代码库更干净
Sep 15 #Javascript
You might like
PHP 文件上传全攻略
2010/04/28 PHP
php开发环境配置记录
2011/01/14 PHP
nginx+php-fpm配置文件的组织结构介绍
2012/11/07 PHP
PHP传值到不同页面的三种常见方式及php和html之间传值问题
2015/11/19 PHP
PHP实现微信商户支付企业付款到零钱功能
2018/09/30 PHP
PHP设计模式之适配器模式(Adapter)原理与用法详解
2019/12/12 PHP
兼容IE/Firefox/Opera/Safari的检测页面装载完毕的脚本Ext.onReady的实现
2009/07/14 Javascript
poshytip 基于jquery的 插件 主要用于显示微博人的图像和鼠标提示等
2012/10/12 Javascript
基于javascipt-dom编程 table对象的使用
2013/04/22 Javascript
nodejs读取memcache示例分享
2014/01/02 NodeJs
Jquery时间轴特效(三种不同类型)
2015/11/02 Javascript
如何使用jquery修改css中带有!important的样式属性
2016/04/28 Javascript
微信小程序 使用picker封装省市区三级联动实例代码
2016/10/28 Javascript
vue.js学习笔记之v-bind和v-on解析
2018/05/03 Javascript
如何用Node写页面爬虫的工具集
2018/10/26 Javascript
微信小程序使用swiper组件实现层叠轮播图
2018/11/04 Javascript
JS关闭子窗口并且刷新上一个窗口的实现示例
2020/03/10 Javascript
[01:26]神话结束了,却也刚刚开始——DOTA2新英雄玛尔斯驾临战场
2019/03/10 DOTA
简单谈谈Python中的元祖(Tuple)和字典(Dict)
2017/04/21 Python
python中利用await关键字如何等待Future对象完成详解
2017/09/07 Python
python pandas dataframe 行列选择,切片操作方法
2018/04/10 Python
python存储16bit和32bit图像的实例
2018/12/05 Python
pandas DataFrame 交集并集补集的实现
2019/06/24 Python
Python测试模块doctest使用解析
2019/08/10 Python
Python大数据之从网页上爬取数据的方法详解
2019/11/16 Python
python怎么删除缓存文件
2020/07/19 Python
Tiqets英国:智能手机上的文化和娱乐门票
2019/07/10 全球购物
小学生打架检讨书
2014/01/26 职场文书
酒店副总经理岗位职责范本
2014/02/04 职场文书
竞选班长演讲稿400字
2014/08/22 职场文书
党的群众路线教育实践活动对照检查材料范文
2014/09/24 职场文书
2014年文明创建工作总结
2014/11/25 职场文书
质量保证书怎么写
2015/02/27 职场文书
2016年会开场白台词
2015/06/01 职场文书
2019年七夕情人节浪漫祝福语大全!
2019/08/08 职场文书
浅谈mysql执行过程以及顺序
2021/05/12 MySQL