JS数组reduce()方法原理及使用技巧解析


Posted in Javascript onJuly 14, 2020

1、语法

arr.reduce(callback,[initialValue])

reduce 为数组中的每一个元素依次执行回调函数,不包括数组中被删除或从未被赋值的元素,接受四个参数:初始值(或者上一次回调函数的返回值),当前元素值,当前索引,调用 reduce 的数组。

callback (执行数组中每个值的函数,包含四个参数)

1、previousValue (上一次调用回调返回的值,或者是提供的初始值(initialValue))

2、currentValue (数组中当前被处理的元素)

3、index (当前元素在数组中的索引)

4、array (调用 reduce 的数组)

initialValue (作为第一次调用 callback 的第一个参数。)如果没有提供initialValue,reduce 会从索引1的地方开始执行 callback 方法,跳过第一个索引。如果提供initialValue,从索引0开始。

2、reduce的简单用法

var arr = [1, 2, 3, 4];
var sum = arr.reduce((x,y)=>x+y)
var mul = arr.reduce((x,y)=>x*y)
console.log( sum ); //求和,10
console.log( mul ); //求乘积,24

1) 计算数组中每个元素出现的次数

let names = ['Alice', 'Bob', 'Tiff', 'Bruce', 'Alice'];

let nameNum = names.reduce((pre,cur)=>{
 if(cur in pre){
  pre[cur]++
 }else{
  pre[cur] = 1 
 }
 return pre
},{})
console.log(nameNum); //{Alice: 2, Bob: 1, Tiff: 1, Bruce: 1}

2)数组去重

let arr = [1,2,3,4,4,1]
let newArr = arr.reduce((pre,cur)=>{
  if(!pre.includes(cur)){
   return pre.concat(cur)
  }else{
   return pre
  }
},[])
console.log(newArr);// [1, 2, 3, 4]

3)将二维数组转化为一维

let arr = [[0, 1], [2, 3], [4, 5]]
let newArr = arr.reduce((pre,cur)=>{
  return pre.concat(cur)
},[])
console.log(newArr); // [0, 1, 2, 3, 4, 5]

4)将多维数组转化为一维

let arr = [[0, 1], [2, 3], [4,[5,6,7]]]
const newArr = function(arr){
  return arr.reduce((pre,cur)=>pre.concat(Array.isArray(cur)?newArr(cur):cur),[])
}
console.log(newArr(arr)); //[0, 1, 2, 3, 4, 5, 6, 7]

5)对象里的属性求和

var result = [
  {
    subject: 'math',
    score: 10
  },
  {
    subject: 'chinese',
    score: 20
  },
  {
    subject: 'english',
    score: 30
  }
];

var sum = result.reduce(function(prev, cur) {
  return cur.score + prev;
}, 0);
console.log(sum) //60

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
js的with语句使用方法
Sep 21 Javascript
javascript操作cookie的文章(设置,删除cookies)
Apr 01 Javascript
jQuery Validation实例代码 让验证变得如此容易
Oct 18 Javascript
JS命名空间的另一种实现
Aug 09 Javascript
jquery操作checkbox示例分享
Jul 21 Javascript
深入学习JavaScript的AngularJS框架中指令的使用方法
Mar 05 Javascript
关于JSON.parse(),JSON.stringify(),jQuery.parseJSON()的用法
Jun 30 Javascript
AngularJS入门教程之静态模板详解
Aug 18 Javascript
JavaScript对象引用与赋值实例详解
Mar 15 Javascript
VueJS 集成 Medium Editor的示例代码 (自定义编辑器按钮)
Aug 24 Javascript
Vue刷新修改页面中数据的方法
Sep 16 Javascript
原生JavaScript实现刮刮乐
Sep 29 Javascript
微信小程序连接服务器展示MQTT数据信息的实现
Jul 14 #Javascript
详解javascript void(0)
Jul 13 #Javascript
Vue组件间数据传递的方式(3种)
Jul 13 #Javascript
vue-cli4项目开启eslint保存时自动格式问题
Jul 13 #Javascript
详解Vue+elementUI build打包部署后字体图标丢失问题
Jul 13 #Javascript
浅谈JavaScript中你可能不知道URL构造函数的属性
Jul 13 #Javascript
Vue3新特性之在Composition API中使用CSS Modules
Jul 13 #Javascript
You might like
PHP排序算法的复习和总结
2012/02/15 PHP
PHP中strlen()和mb_strlen()的区别浅析
2014/06/19 PHP
通过修改配置真正解决php文件上传大小限制问题(nginx+php)
2015/09/23 PHP
Yii2中OAuth扩展及QQ互联登录实现方法
2016/05/16 PHP
Laravel解决nesting level错误和隐藏index.php的问题
2019/10/12 PHP
使用TextRange获取输入框中光标的位
2006/10/14 Javascript
解决FireFox下[使用event很麻烦]的问题
2006/11/26 Javascript
javascript框架设计读书笔记之模块加载系统
2014/12/02 Javascript
深入探密Javascript数组方法
2015/01/08 Javascript
Javascript中的Callback方法浅析
2015/03/15 Javascript
javascript框架设计之种子模块
2015/06/23 Javascript
基于原生JS实现图片裁剪
2016/08/01 Javascript
JS闭包可被利用的常见场景小结
2017/04/09 Javascript
Vuex实现计数器以及列表展示效果
2018/03/10 Javascript
学习使用ExpressJS 4.0中的新Router的用法
2018/11/06 Javascript
Bootstrap 时间日历插件bootstrap-datetimepicker配置与应用小结
2019/05/28 Javascript
js中!和!!的区别与用法
2020/05/09 Javascript
Json实现传值到后台代码实例
2020/06/30 Javascript
echarts 使用formatter 修改鼠标悬浮事件信息操作
2020/07/20 Javascript
[04:11]2014DOTA2国际邀请赛 CIS遗憾出局梦想不灭
2014/07/09 DOTA
django轻松使用富文本编辑器CKEditor的方法
2017/03/30 Python
python机器学习之随机森林(七)
2018/03/26 Python
python用插值法绘制平滑曲线
2021/02/19 Python
对tensorflow 中tile函数的使用详解
2020/02/07 Python
pandas中的数据去重处理的实现方法
2020/02/10 Python
Pycharm和Idea支持的vim插件的方法
2020/02/21 Python
美国全球旅游运营商:Pacific Holidays
2018/06/18 全球购物
毕业生幼师求职自荐信
2013/10/01 职场文书
好的促销活动方案
2014/08/21 职场文书
高一课前三分钟演讲稿
2014/09/13 职场文书
2014年导购员工作总结
2014/11/18 职场文书
合理化建议书
2015/02/04 职场文书
win10下go mod配置方式
2021/04/25 Golang
Pytorch 如何加速Dataloader提升数据读取速度
2021/05/28 Python
Redis命令处理过程源码解析
2022/02/12 Redis
电频谱管理的原则是什么
2022/02/18 无线电