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 相关文章推荐
ASP.NET MVC中EasyUI的datagrid跨域调用实现代码
Mar 14 Javascript
使用PHP+JQuery+Ajax分页的实现
Apr 23 Javascript
jQuery树形下拉菜单特效代码分享
Aug 15 Javascript
Bootstrap 源代码分析(未完待续)
Aug 17 Javascript
本地Bootstrap文件字体图标引入却无法显示问题的解决方法
Apr 18 Javascript
基于Vue如何封装分页组件
Dec 16 Javascript
详解如何构建Angular项目目录结构
Jul 13 Javascript
JS中双击和单击事件冲突的解决方法
Apr 09 Javascript
浅谈在vue中使用mint-ui swipe遇到的问题
Sep 27 Javascript
JS 实现发送短信验证码的“59秒后重新发送验证短信”功能
Aug 23 Javascript
Vue 实现输入框新增搜索历史记录功能
Oct 15 Javascript
JavaScript代码压缩工具UglifyJS和Google Closure Compiler的基本用法
Apr 13 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写的小东西
2006/12/06 PHP
PHP 采集程序 常用函数
2008/12/18 PHP
ThinkPHP模板自定义标签使用方法
2014/06/26 PHP
PHP文件操作之获取目录下文件与计算相对路径的方法
2016/01/08 PHP
php实现微信公众号企业转账功能
2018/10/01 PHP
PHP迭代器和生成器用法实例分析
2019/09/28 PHP
让firefox支持IE的一些方法的javascript扩展函数代码
2010/01/02 Javascript
jQuery EasyUI中对表格进行编辑的实现代码
2010/06/10 Javascript
JS刷新当前页面的几种方法总结
2013/12/24 Javascript
javascript中的previousSibling和nextSibling的正确用法
2015/09/16 Javascript
jQuery动态添加及删除表单上传元素的方法(附demo源码下载)
2016/01/15 Javascript
javascript实现下雪效果【实例代码】
2016/05/03 Javascript
Knockoutjs 学习系列(二)花式捆绑
2016/06/07 Javascript
浅谈jQuery效果函数
2016/09/16 Javascript
JavaScript实现隐藏省略文字效果的方法
2017/04/27 Javascript
jQuery获取单选按钮radio选中值与去除所有radio选中状态的方法
2017/05/20 jQuery
vue.js实现数据动态响应 Vue.set的简单应用
2017/06/15 Javascript
Angularjs 手写日历的实现代码(不用插件)
2017/10/18 Javascript
详解Vue打包优化之code spliting
2018/04/09 Javascript
使用JavaScript实现贪吃蛇游戏
2020/09/29 Javascript
[42:22]DOTA2上海特级锦标赛C组小组赛#1 OG VS Archon第一局
2016/02/27 DOTA
[00:12]DAC2018 no[o]ne亮相SOLO赛 他是否如他的id一样无人可挡?
2018/04/06 DOTA
[39:21]LGD vs OG 2019国际邀请赛淘汰赛 胜者组 BO3 第二场 8.24
2019/09/10 DOTA
Python实现的读取文件内容并写入其他文件操作示例
2019/04/09 Python
Python3中_(下划线)和__(双下划线)的用途和区别
2019/04/26 Python
python读写数据读写csv文件(pandas用法)
2020/12/14 Python
CSS3 新增选择器的实例
2019/11/13 HTML / CSS
女装和独特珠宝:Sundance Catalog
2018/09/19 全球购物
365 Tickets英国:全球景点门票
2019/07/06 全球购物
什么是就业协议书
2014/04/17 职场文书
党的群众路线领导班子整改方案
2014/09/27 职场文书
2015年国庆节广播稿
2015/08/19 职场文书
go使用Gin框架利用阿里云实现短信验证码功能
2021/08/04 Golang
Windows 11要来了?微软文档揭示Win11太阳谷 / Win10有两个不同版本
2021/11/21 数码科技
Win11更新失败并提示0xc1900101
2022/04/19 数码科技
Redis 报错 error:NOAUTH Authentication required
2022/05/15 Redis