JavaScript数组reduce()方法的语法与实例解析


Posted in Javascript onJuly 07, 2021

前言

reduce() 方法接收一个函数作为累加器(accumulator),数组中的每个值(从左到右)开始缩减,最终为一个值。

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

Javascript数组方法中,相比map、filter、forEach等常用的迭代方法,reduce常常被我们所忽略,今天一起来探究一下reduce在我们实战开发当中,能有哪些妙用之处,下面从reduce语法开始介绍。

1、语法

array.reduce(function(prev, cur, index, arr), initialValue)
//简写方便解释
arr.reduce(callback,[initialValue])

参数含义:

callback (执行数组中每个值的函数,包含四个参数)
    1、previousValue (上一次调用回调返回的值,或者是提供的初始值(initialValue))
    2、currentValue (数组中当前被处理的元素)
    3、index (当前元素在数组中的索引)
    4、array (调用 reduce 的数组)
initialValue (作为第一次调用 callback 的第一个参数。)类似相当于设置初始值

2、实例解析 initialValue 参数

先看第一个例子:

var arr = [1, 2, 3, 4];
var sum = arr.reduce(function(prev, cur, index, arr) {
    console.log(prev, cur, index);
    return prev + cur;
})
console.log(arr, sum);
//打印结果:
//1 2 1
//3 3 2
//6 4 3
//[1, 2, 3, 4] 10

这里可以看出,上面的例子index是从1开始的,第一次的prev的值是数组的第一个值。数组长度是4,但是reduce函数循环3次。

再看第二个例子:

var  arr = [1, 2, 3, 4];
var sum = arr.reduce(function(prev, cur, index, arr) {
    console.log(prev, cur, index);
    return prev + cur;
},0) //注意这里设置了初始值
console.log(arr, sum);
//打印结果:
//0 1 0
//1 2 1
//3 3 2
//6 4 3
//[1, 2, 3, 4] 10

这个例子index是从0开始的,第一次的prev的值是我们设置的初始值0,数组长度是4,reduce函数循环4次。

结论:如果没有提供initialValue,reduce 会从索引1的地方开始执行 callback 方法,跳过第一个索引。如果提供initialValue,从索引0开始。

注意:如果这个数组为空,运用reduce是什么情况?

var  arr = [];
var sum = arr.reduce(function(prev, cur, index, arr) {
    console.log(prev, cur, index);
    return prev + cur;
})
//报错,"TypeError: Reduce of empty array with no initial value"

但是要是我们设置了初始值就不会报错,如下:

var  arr = [];
var sum = arr.reduce(function(prev, cur, index, arr) {
    console.log(prev, cur, index);
    return prev + cur;
},0)
console.log(arr, sum); // [] 0

所以一般来说我们提供初始值通常更安全

3、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

4、reduce的高级用法

(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]

(3)将多维数组转化为一维

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]

(4)对象里的属性求和

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数组reduce()方法的文章就介绍到这了,更多相关JS数组reduce()方法内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Javascript 相关文章推荐
javascript的console.log()用法小结
May 31 Javascript
Android中的jQuery:AQuery简介
May 06 Javascript
javascript实现微信分享
Dec 23 Javascript
了解Javascript的模块化开发
Mar 02 Javascript
jQuery实现滚动鼠标放大缩小图片的方法(附demo源码下载)
Mar 05 Javascript
jQuery获取radio选中项的值实例
Jun 18 Javascript
JS命令模式例子之菜单程序
Oct 10 Javascript
Angular2仿照微信UI实现9张图片上传和预览的示例代码
Oct 19 Javascript
浅谈vue中改elementUI默认样式引发的static与assets的区别
Feb 03 Javascript
Node.js中的cluster模块深入解读
Jun 11 Javascript
CSS3 动画卡顿性能优化的完美解决方案
Sep 20 Javascript
vuejs router history 配置到iis的方法
Sep 20 Javascript
Vue3.0中Ref与Reactive的区别示例详析
Jul 07 #Vue.js
Vue项目打包、合并及压缩优化网页响应速度
教你使用vscode 搭建react-native开发环境
idea编译器vue缩进报错问题场景分析
jQuery实现广告显示和隐藏动画
Vue实现导入Excel功能步骤详解
javascript数组includes、reduce的基本使用
Jul 02 #Javascript
You might like
php smarty模版引擎中的缓存应用
2009/12/02 PHP
色色整理的PHP面试题集锦
2012/03/08 PHP
深入探讨:Nginx 502 Bad Gateway错误的解决方法
2013/06/03 PHP
windows7下php开发环境搭建图文教程
2015/01/06 PHP
laravel 解决crontab不执行的问题
2019/10/22 PHP
js 得到文件后缀(通过正则实现)
2013/07/08 Javascript
使用js如何实现全选与全不选
2013/12/30 Javascript
javascript实现数字+字母验证码的简单实例
2014/02/10 Javascript
使用jQuery获得内容以及内容的属性
2015/02/26 Javascript
javascript每日必学之基础入门
2016/02/16 Javascript
论Bootstrap3和Foundation5网格系统的异同
2016/05/16 Javascript
AngularJS 遇到的小坑与技巧小结
2016/06/07 Javascript
深入解析桶排序算法及Node.js上JavaScript的代码实现
2016/07/06 Javascript
ion content 滚动到底部会遮住一部分视图的快速解决方法
2016/09/06 Javascript
Bootstrap基本插件学习笔记之Alert警告框(20)
2016/12/08 Javascript
解决使用Vue.js显示数据的时,页面闪现原始代码的问题
2018/02/11 Javascript
vue弹窗组件使用方法
2018/04/28 Javascript
javascript深拷贝、浅拷贝和循环引用深入理解
2018/05/27 Javascript
微信小程序学习笔记之表单提交与PHP后台数据交互处理图文详解
2019/03/28 Javascript
vue路由拦截器和请求拦截器知识点总结
2019/11/08 Javascript
在vue中使用axios实现post方式获取二进制流下载文件(实例代码)
2019/12/16 Javascript
Vue+ElementUI 中级联选择器Bug问题的解决
2020/07/31 Javascript
[08:54]《一刀刀一天》之DOTA全时刻18:十九支奔赴西雅图队伍全部出炉
2014/06/04 DOTA
python代码检查工具pylint 让你的python更规范
2012/09/05 Python
给Python IDLE加上自动补全和历史功能
2014/11/30 Python
在Python下利用OpenCV来旋转图像的教程
2015/04/16 Python
Python 常用 PEP8 编码规范详解
2017/01/22 Python
python利用opencv保存、播放视频
2020/11/02 Python
CSS3教程:边框属性border的极致应用
2009/04/02 HTML / CSS
CSS3网格的三个新特性详解
2014/04/04 HTML / CSS
《孔子游春》教学反思
2014/02/25 职场文书
学校督导评估方案
2014/06/10 职场文书
演讲比赛策划方案
2014/06/11 职场文书
公司门卫工作职责
2014/06/28 职场文书
2016年公务员六五普法心得体会
2016/01/21 职场文书
基于python制作简易版学生信息管理系统
2021/04/20 Python