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 相关文章推荐
本地图片预览(支持IE6/IE7/IE8/Firefox3)经验总结
Mar 25 Javascript
javascript获取url上某个参数的方法
Nov 08 Javascript
JavaScript淡入淡出渐变简单实例
Aug 06 Javascript
跟我学习javascript的函数和函数表达式
Nov 16 Javascript
原生js实现jquery函数animate()动画效果的简单实例
Aug 21 Javascript
JavaScript中const、var和let区别浅析
Oct 11 Javascript
使用DeviceOne实现微信小程序功能
Dec 29 Javascript
从零开始搭建一个react项目开发
Feb 09 Javascript
解决angularjs service中依赖注入$scope报错的问题
Oct 02 Javascript
Vue CLI 2.x搭建vue(目录最全分析)
Feb 27 Javascript
简单谈谈javascript高级特性
Sep 04 Javascript
Ant Design Pro 之 ProTable使用操作
Oct 31 Javascript
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 加密与解密的斗争
2009/04/17 PHP
PHP 开发环境配置(测试开发环境)
2010/04/28 PHP
PHP之生成GIF动画的实现方法
2013/06/07 PHP
Codeigniter操作数据库表的优化写法总结
2014/06/12 PHP
让ThinkPHP支持大小写url地址访问的方法
2014/10/31 PHP
详解PHP错误日志的获取方法
2015/07/20 PHP
PHP操作MySQL中BLOB字段的方法示例【存储文本与图片】
2017/09/15 PHP
浅谈PHP中的Trait使用方法
2019/03/22 PHP
Javascript 通过json自动生成Dom的代码
2010/04/01 Javascript
jQuery应用之jQuery链用法实例
2015/01/19 Javascript
jQuery实现流动虚线框的方法
2015/01/29 Javascript
jQuery对象与DOM对象之间的相互转换
2015/03/03 Javascript
javascript动态创建链接的方法
2015/05/13 Javascript
如何在Linux上安装Node.js
2016/04/01 Javascript
Spring Boot/VUE中路由传递参数的实现代码
2018/03/02 Javascript
JavaScript继承与聚合实例详解
2019/01/22 Javascript
js简单遍历获取对象中的属性值的方法示例
2019/06/19 Javascript
使用Python开发windows GUI程序入门实例
2014/10/23 Python
用Python编写一个国际象棋AI程序
2014/11/28 Python
使用httplib模块来制作Python下HTTP客户端的方法
2015/06/19 Python
Django 忘记管理员或忘记管理员密码 重设登录密码的方法
2018/05/30 Python
python学生管理系统开发
2019/01/30 Python
python tkinter库实现气泡屏保和锁屏
2019/07/29 Python
python绘制玫瑰的实现代码
2020/03/02 Python
Python常用数据分析模块原理解析
2020/07/20 Python
把Anaconda中的环境导入到Pycharm里面的方法步骤
2020/10/30 Python
在线学习西班牙语、法语或其他语言:Babbel.com
2018/02/07 全球购物
彪马俄罗斯官网:PUMA俄罗斯
2019/07/13 全球购物
LINUX下线程,GDI类的解释
2016/12/14 面试题
入党自我鉴定范文
2013/10/04 职场文书
医学生自我鉴定范文
2013/11/08 职场文书
个人融资协议书范本两则
2014/10/15 职场文书
关于学习的决心书
2015/02/05 职场文书
唐山大地震的观后感
2015/06/05 职场文书
食堂管理制度范本
2015/08/04 职场文书
mysql性能优化以及配置连接参数设置
2022/05/06 MySQL