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 相关文章推荐
Hutia 的 JS 代码集
Oct 24 Javascript
元素的内联事件处理函数的特殊作用域在各浏览器中存在差异
Jan 12 Javascript
浅析Js中的单引号与双引号问题
Nov 06 Javascript
vue.js表格组件开发的实例详解
Oct 12 Javascript
jQuery Ajax File Upload实例源码
Dec 12 Javascript
Vue数据驱动模拟实现4
Jan 12 Javascript
纯JS实现只能输入数字的简单代码
Jun 21 Javascript
Vuex的基本概念、项目搭建以及入坑点
Nov 04 Javascript
JavaScript禁用右键单击优缺点分析
Jan 20 Javascript
JS实现网站吸顶条
Jan 08 Javascript
浅析JS中NEW的实现原理及重写
Feb 20 Javascript
Vue 数据绑定的原理分析
Nov 16 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中使用__autoload()自动加载未定义类的实现代码
2013/02/06 PHP
php采用curl访问域名返回405 method not allowed提示的解决方法
2014/06/26 PHP
yii权限控制的方法(三种方法)
2015/12/28 PHP
基于laravel制作APP接口(API)
2016/03/15 PHP
PHP 以POST方式提交XML、获取XML,解析XML详解及实例
2016/10/26 PHP
PHP从零开始打造自己的MVC框架之入口文件实现方法详解
2019/06/03 PHP
php 使用expat方式解析xml文件操作示例
2019/11/26 PHP
仅IE支持clearAttributes/mergeAttributes方法使用介绍
2012/05/04 Javascript
javascript的字符串按引用复制和传递,按值来比较介绍与应用
2012/12/28 Javascript
一个简单的实现下拉框多选的插件可移植性比较好
2014/05/05 Javascript
jQuery中die()方法用法实例
2015/01/19 Javascript
js实现带按钮的上下滚动效果
2015/05/12 Javascript
JS实现的相册图片左右滚动完整实例
2016/11/23 Javascript
客户端(vue框架)与服务器(koa框架)通信及服务器跨域配置详解
2017/08/26 Javascript
nodejs之koa2请求示例(GET,POST)
2018/08/07 NodeJs
手把手带你入门微信小程序新框架Kbone的使用
2020/02/25 Javascript
不刷新网页就能链接新的js文件方法总结
2020/03/01 Javascript
浅谈JavaScript中你可能不知道URL构造函数的属性
2020/07/13 Javascript
使用DataFrame删除行和列的实例讲解
2018/04/08 Python
python根据url地址下载小文件的实例
2018/12/18 Python
python通过文本在一个图中画多条线的实例
2020/02/21 Python
一文详述 Python 中的 property 语法
2020/09/01 Python
python实现excel公式格式化的示例代码
2020/12/23 Python
python绘制高斯曲线
2021/02/19 Python
100%羊绒:NakedCashmere
2020/08/26 全球购物
程序员机试试题汇总
2012/03/07 面试题
工程管理造价应届生求职信
2013/11/13 职场文书
新驾驶员个人自我评价
2014/01/03 职场文书
2014年高三班主任工作总结
2014/12/05 职场文书
2015年安全生产月活动总结
2015/03/26 职场文书
教师评职称工作总结2015
2015/04/20 职场文书
旷工检讨书大全
2015/08/15 职场文书
《正比例》教学反思
2016/02/23 职场文书
小学四年级作文之写景
2019/08/23 职场文书
Django migrate报错的解决方案
2021/05/20 Python
为什么RedisCluster设计成16384个槽
2021/09/25 Redis