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 相关文章推荐
js操作Xml(向服务器发送Xml,处理服务器返回的Xml)(IE下有效)
Jan 30 Javascript
jquery 删除cookie失效的解决方法
Nov 12 Javascript
js中将String转换为number以便比较
Jul 08 Javascript
js判断子窗体是否关闭的方法
Aug 11 Javascript
JavaScript正则表达式的分组匹配详解
Feb 13 Javascript
Javascript如何判断数据类型和数组类型
Jun 22 Javascript
JS导出PDF插件的方法(支持中文、图片使用路径)
Jul 12 Javascript
Express + Session 实现登录验证功能
Sep 08 Javascript
angularjs实现分页和搜索功能
Jan 03 Javascript
微信小程序之圆形进度条实现思路
Feb 22 Javascript
vue基于两个计算属性实现选中和全选功能示例
Feb 08 Javascript
vue中使用mockjs配置和使用方式
Apr 06 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
简单实用的.net DataTable导出Execl
2013/10/28 PHP
md5 16位二进制与32位字符串相互转换示例
2013/12/30 PHP
php实现事件监听与触发的方法
2014/11/21 PHP
分享14个很酷的jQuery导航菜单插件
2011/04/25 Javascript
JS性能优化笔记搜索整理
2013/08/21 Javascript
原生JS实现LOADING效果
2015/03/16 Javascript
AngularJS动态加载模块和依赖的方法分析
2016/11/08 Javascript
ES6通过babel转码使用webpack使用import关键字
2016/12/13 Javascript
jQuery插件FusionCharts实现的3D帕累托图效果示例【附demo源码】
2017/03/25 jQuery
微信小程序三级联动地址选择器的实例代码
2017/07/12 Javascript
JS实现简单短信验证码界面
2017/08/07 Javascript
利用JS制作万年历的方法
2017/08/16 Javascript
信息滚动效果的实例讲解
2017/09/18 Javascript
vue分页器组件编写方法详解
2019/06/28 Javascript
从零使用TypeScript开发项目打包发布到npm
2020/02/14 Javascript
JavaScript函数Call、Apply原理实例解析
2020/02/17 Javascript
解决ant design vue中树形控件defaultExpandAll设置无效的问题
2020/10/26 Javascript
[02:28]DOTA2亚洲邀请赛 LGD战队巡礼
2015/02/03 DOTA
[01:07:19]2018DOTA2亚洲邀请赛 4.5 淘汰赛 Mineski vs VG 第一场
2018/04/06 DOTA
Python pickle模块用法实例
2015/04/14 Python
python获取元素在数组中索引号的方法
2015/07/15 Python
python实现简单聊天应用 python群聊和点对点均实现
2017/09/14 Python
python实现list由于numpy array的转换
2018/04/04 Python
python实现电脑自动关机
2018/06/20 Python
python如何实现从视频中提取每秒图片
2020/10/22 Python
Python实现栈的方法详解【基于数组和单链表两种方法】
2020/02/22 Python
用 Python 制作地球仪的方法
2020/04/24 Python
Python中有几个关键字
2020/06/04 Python
python 绘制正态曲线的示例
2020/09/24 Python
Selenium环境变量配置(火狐浏览器)及验证实现
2020/12/07 Python
详解css3 mask遮罩实现一些特效
2018/10/24 HTML / CSS
英国和爱尔兰的自炊式豪华度假小屋:Rural Retreats
2018/06/08 全球购物
争先创优活动总结
2014/08/27 职场文书
2016春季幼儿园开学寄语
2015/12/03 职场文书
各种货币符号快捷输入
2022/02/17 杂记
Python 一键获取电脑浏览器的账号密码
2022/05/11 Python