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实现浏览器的title闪烁
Jul 08 Javascript
页面图片浮动左右滑动效果的简单实现案例
Feb 10 Javascript
jquery实现一个简单的表单验证实例
Mar 30 Javascript
JS动态计算移动端rem的解决方案
Oct 14 Javascript
jQuery实现遮罩层登录对话框
Dec 29 Javascript
JS字符串统计操作示例【遍历,截取,输出,计算】
Mar 27 Javascript
Vue.js上下滚动加载组件的实例代码
Jul 17 Javascript
vue项目中公用footer组件底部位置的适配问题
May 10 Javascript
vue中的ref和$refs的使用
Nov 22 Javascript
微信小程序如何自定义table组件
Jun 29 Javascript
前端vue如何使用高德地图
Nov 05 Javascript
vue实现可拖拽的dialog弹框
May 13 Vue.js
微信小程序连接服务器展示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环境配置 php5 mysql5 apache2 phpmyadmin安装与配置
2006/11/17 PHP
PHP数组编码gbk与utf8互相转换的两种方法
2016/09/01 PHP
php7安装yar扩展的方法详解
2017/08/03 PHP
PHP读取文件,解决中文乱码UTF-8的方法分析
2020/01/22 PHP
JS日历 推荐
2006/12/03 Javascript
半角全角相互转换的js函数
2009/10/16 Javascript
IE6浏览器下resize事件被执行了多次解决方法
2012/12/11 Javascript
关于innerHTML后丢失动态绑定的EVENT问题解决方法
2013/05/19 Javascript
javascript设计模式之解释器模式详解
2014/06/05 Javascript
javascript实现炫酷的拖动分页
2015/05/11 Javascript
基于BootStrap Metronic开发框架经验小结【六】对话框及提示框的处理和优化
2016/05/12 Javascript
前端实现文件的断点续传(前端文件提交+后端PHP文件接收)
2016/11/04 Javascript
Node.js如何使用Diffie-Hellman密钥交换算法详解
2017/09/05 Javascript
浅谈webpack打包过程中因为图片的路径导致的问题
2018/02/21 Javascript
Swiper 4.x 使用方法(移动端网站的内容触摸滑动)
2018/05/17 Javascript
详解Vue中使用Echarts的两种方式
2018/07/03 Javascript
解决bootstrap中下拉菜单点击后不关闭的问题
2018/08/10 Javascript
小程序实现左右来回滚动字幕效果
2018/12/28 Javascript
React传值 组件传值 之间的关系详解
2019/08/26 Javascript
[01:03:54]Liquid vs IG 2018国际邀请赛小组赛BO2 第一场 8.17
2018/08/18 DOTA
django中send_mail功能实现详解
2018/02/06 Python
Python简单实现的代理服务器端口映射功能示例
2018/04/08 Python
pyecharts绘制中国2020肺炎疫情地图的实例代码
2020/02/12 Python
python中把元组转换为namedtuple方法
2020/12/09 Python
HTML5 canvas基本绘图之绘制曲线
2016/06/27 HTML / CSS
ALLSAINTS英国官网:伦敦新锐潮流品牌
2016/09/19 全球购物
澳大利亚最好的在线时尚精品店:Princess Polly
2018/01/03 全球购物
网络工程师的自我评价
2013/10/02 职场文书
文明青少年标兵事迹材料
2014/01/28 职场文书
保护动物倡议书
2014/04/15 职场文书
体育系毕业生自荐信
2014/06/28 职场文书
中学教师师德师风演讲稿
2014/08/22 职场文书
护士节演讲稿开场白
2014/08/25 职场文书
营销计划书
2015/01/17 职场文书
《倍数和因数》教学反思
2016/02/23 职场文书
详解MySQL集群搭建
2021/05/26 MySQL