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 相关文章推荐
基于jQuery试卷自动排版系统
Jul 18 Javascript
JQuery选择器特辑 详细小结
May 14 Javascript
JavaScript设计模式之工厂方法模式介绍
Dec 28 Javascript
使用Node.js实现HTTP 206内容分片的教程
Jun 23 Javascript
JavaScript框架是什么?怎样才能叫做框架?
Jul 01 Javascript
Angular指令封装jQuery日期时间插件datetimepicker实现双向绑定示例
Jan 22 Javascript
MVVM框架下实现分页功能示例
Jun 14 Javascript
vue异步axios获取的数据渲染到页面的方法
Aug 09 Javascript
angular 实时监听input框value值的变化触发函数方法
Aug 31 Javascript
了解javascript中的Dom操作
May 27 Javascript
webpack 最佳配置指北(推荐)
Jan 07 Javascript
vue 实现一个简单的全局调用弹窗案例
Sep 10 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 Error与Logging函数的深入理解
2013/06/03 PHP
php实现的一个简单json rpc框架实例
2015/03/30 PHP
通过Email发送PHP错误的方法
2015/07/20 PHP
PHP判断来访是搜索引擎蜘蛛还是普通用户的代码小结
2015/09/14 PHP
JavaScript获取客户端计算机硬件及系统等信息的方法
2014/01/02 Javascript
Underscore.js常用方法总结
2015/02/28 Javascript
深入理解JavaScript系列(44):设计模式之桥接模式详解
2015/03/04 Javascript
在JavaScript中使用对数Math.log()方法的教程
2015/06/15 Javascript
javaScript实现可缩放的显示区效果代码
2015/10/26 Javascript
实例代码讲解jquery easyui动态tab页
2015/11/17 Javascript
jQuery焦点图插件SaySlide
2015/12/21 Javascript
Node.js项目中调用JavaScript的EJS模板库的方法
2016/03/11 Javascript
聊一聊JavaScript作用域和作用域链
2016/05/03 Javascript
Bootstrap富文本组件wysiwyg数据保存到mysql的方法
2016/05/09 Javascript
jquery获取所有选中的checkbox实现代码
2016/05/26 Javascript
详解webpack + vue + node 打造单页面(入门篇)
2017/09/23 Javascript
详解使用vue-admin-template的优化历程
2018/05/20 Javascript
Babel 入门教程学习笔记
2018/06/13 Javascript
vue实现Excel文件的上传与下载功能的两种方式
2019/06/28 Javascript
JavaScript实现拖拽效果
2020/03/16 Javascript
微信小程序个人中心的列表控件实现代码
2020/04/26 Javascript
webpack5 联邦模块介绍详解
2020/07/08 Javascript
linux系统使用python监测系统负载脚本分享
2014/01/15 Python
python实现决策树C4.5算法详解(在ID3基础上改进)
2017/05/31 Python
Python OpenCV图像指定区域裁剪的实现
2019/10/30 Python
Python应用实现双指数函数及拟合代码实例
2020/06/19 Python
Python 使用生成器代替线程的方法
2020/08/04 Python
使用Python下载抖音各大V视频的思路详解
2021/02/06 Python
简单掌握CSS3中resize属性的用法
2016/04/01 HTML / CSS
学前教育求职自荐信范文
2013/12/25 职场文书
行政内勤岗位职责
2014/04/07 职场文书
5s推行计划书
2014/05/06 职场文书
企业愿景口号
2015/12/25 职场文书
蓝天保卫战收官在即 :15行业将开展环保分级评价
2019/07/19 职场文书
使用opencv-python如何打开USB或者笔记本前置摄像头
2022/06/21 Python
Nginx跨域问题解析与解决
2022/08/05 Servers