reduce() 方法对数组中的每个元素执行一个由您提供的reducer函数(升序执行),将其结果汇总为单个返回值。

有点抽象,意思可以看做每个元素执行之后,都会有一个汇总结果,你可以通过这个汇总结果返回一个你想要的值,这个值可以是任意类型的。

语法格式:

arr.reduce(callback(accumulator, currentValue[, index[, array]])[, initialValue])

写明白点就是:

arr.reduce(function(accumulator, currentValue, currentIndex, array), initialValue)

其中有接收两个参数:

callback:回调函数

initialValue:初始值

初始值可选

再来看看回调函数的参数,它接收四个参数:

Accumulator (acc) (累计器)

Current Value (cur) (当前值)

Current Index (idx) (当前索引,可选)

Source Array (src) (源数组,可选)

其中累加器和当前值取值有两种情况

回调函数第一次执行时,累加器和当前值的取值有两种情况:如果调用reduce()时提供了initialValue,累加器取值为initialValue,当前值取数组中的第一个值;如果没有提供 initialValue,那么累加器取数组中的第一个值,当前值取数组中的第二个值。

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

reduce() 如何运行

[0, 1, 2, 3, 4].reduce(function(accumulator, currentValue, currentIndex, array){
return accumulator + currentValue;
});

执行过程:

callback 累加器 当前值 当前索引 当前数组 返回结果
第一次执行 0 1 1 [0, 1, 2, 3, 4] 1
第二次执行 1 2 2 [0, 1, 2, 3, 4] 3
第三次执行 3 3 3 [0, 1, 2, 3, 4] 6
第四次执行 6 4 4 [0, 1, 2, 3, 4] 10

由上表可以看出,每次执行的结果都会作为下一次累加器的值。

注意:不指定初始值的时候,执行过程从索引为1处开始执行

let acc2=arr.reduce(function(accumulator, currentValue, currentIndex, array){
return accumulator+currentValue
},10)
callback 累加器 当前值 当前索引 当前数组 返回结果
第一次执行 10 0 0 [0, 1, 2, 3, 4] 10
第二次执行 10 1 1 [0, 1, 2, 3, 4] 11
第三次执行 11 2 2 [0, 1, 2, 3, 4] 13
第四次执行 13 3 3 [0, 1, 2, 3, 4] 16
第五次执行 16 4 4 [0, 1, 2, 3, 4] 20

实例一:数组去重

let arr3 =['q','q','w','e','f','d','s','w','e','w','e','d','s','a','a','a','s']
let res=arr3.reduce(function(accumulator, currentValue){
if(accumulator.indexOf(currentValue)===-1){
accumulator.push(currentValue)
}
return accumulator
},[])

实例二:统计字符出险次数个数

let str ='qqqqwwwwssssddddcccfffvvvvvbbbbb'
let arr4=str.split("")
let map2=arr4.reduce(function (accumulator, currentValue) {
if(accumulator.get(currentValue)===undefined){
accumulator.set(currentValue,1)
}else{
accumulator.set(currentValue,accumulator.get(currentValue)+1)
}
return accumulator
},new Map())

或者:

let str3 ='qqqqwwwwssssddddcccfffvvvvvbbbbb'
let arr6=str.split("")
let arr7=arr4.reduce(function (accumulator, currentValue) {
if(currentValue in accumulator){
accumulator[currentValue]++
}else{
accumulator[currentValue]=1
}
return accumulator
},{})

JavaScript高级~数组方法reduce的更多相关文章

  1. Javascript中数组方法reduce的妙用之处

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

  2. 几个关于js数组方法reduce的经典片段

    以下是个人在工作中收藏总结的一些关于javascript数组方法reduce的相关代码片段,后续遇到其他使用这个函数的场景,将会陆续添加,这里作为备忘. javascript数组那么多方法,为什么我要 ...

  3. JavaScript Array 数组方法汇总

    JavaScript Array 数组方法汇总 1. arr.push() 从后面添加元素,返回值为添加完后的数组的长度 var arr = [1,2,3,4,5] console.log(arr.p ...

  4. JavaScript数组方法--reduce、reduceRIght、reverse

    今天写的reduce是比较复杂的一个数组方法,其实在这之前我也用过reduce,可是每次用起来总感觉不那么顺手,主要还是因为不熟,对reduce本身不熟.首先reduce这个单词翻译为中文,不那么直观 ...

  5. JavaScript Array数组方法详解

    Array类型是ECMAScript中最常用的引用类型.ECMAScript中的数据与其它大多数语言中的数组有着相当大的区别.虽然ECMAScript中的数据与其它语言中的数组一样都是数据的有序列表, ...

  6. ES5 数组方法reduce

    reduce() 方法接收一个函数作为累加器(accumulator),数组中的每个值(从左到右)开始合并,最终为一个值. 参数 callback 执行数组中每个值的函数,包含四个参数 previou ...

  7. JavaScript之数组方法整理

    Array概述      除了Object类型,最常用的类型:      实质:有序的数据列表,      特性:可以动态的调整数组的大小 创建数组的两种方式 构造函数创建方式  var arr = ...

  8. JavaScript常用数组方法

    JavaScript数组方法有以下这些: forEach() 方法对数组的每一个元素执行一次提供的函数. map() 方法创建一个新数组,其结果是该数组都执行一次函数,原函数保持不变. filter( ...

  9. JavaScript的数组方法(array)

    数组方法: 1. concat()  合并数组 2. join()  将数组的元素拼接成字符串,并指定分隔符 3. push()  往数组末尾添加一个元素,并返回新的数组的长度 4. reverse( ...

  10. 【JavaScript】数组方法之基础方法

    数组方法之基础方法 Array 对象属性 属性 描述 constructor 返回对创建此对象的数组函数的引用. length 设置或返回数组中元素的数目. prototype 使您有能力向对象添加属 ...

随机推荐

  1. Android OpenMAX(七)OMX Service

    上一篇文章我们分析了Android使用OMXStore来管理平台上的软件和硬件编解码组件,这一篇我们再向上一层了解应用层是如何获取调用OMXStore管理组件的.本篇文章代码参考自: framewor ...

  2. OceaBase 分区表创建技巧

    最近遇在干个核心的金融项目,规模很大,客户主要是用oracle数据库,现在需要适配ob,原来在oracle就是分区表的迁来ob以后需要进行改造. oracle默认使用是堆表(ht),而ob使用的是索引 ...

  3. 算法金 | 突破最强算法模型!!学会随机森林,你也能发表高水平SCI

    大侠幸会,在下全网同名「算法金」 0 基础转 AI 上岸,多个算法赛 Top 「日更万日,让更多人享受智能乐趣」 就在去年下半年,如果你在 Google Scholar 上以 "Random ...

  4. 通过钩子函数+Traceid实现Flask链路追踪

    背景 在flask web中我们通常需要一个traceid作为调用参数传递给全链路各个调用函数 需要针对一次请求创建一个唯一的traceid:这里用uuid去简化代替 我们需要保证traceid不被污 ...

  5. 《利用python进行数据分析》笔记章节索引

    本文章作为我的一系列关于<利用python进行数据分析>的笔记的文章的索引.分为四部分. 第一部分:numpy基础,共六节: numpy基础--ndarray(一种多维数组对象):http ...

  6. Java方法传参中"..."的作用

    # Java方法传参中 `...` 类型名 介绍 - <font color = 'blue'>**类型 ... 类型名**</font> 表示可变长度的参数,本质是**数组* ...

  7. sql数据的操作

      /*             数据的写入                 名称 : 库名 表名 字段名 用 反引号包裹                 数据 : 字符串数据使用单引号包裹      ...

  8. LeetCode 451. Sort Characters By Frequency 根据字符出现频率排序 (C++/Java)

    题目: Given a string, sort it in decreasing order based on the frequency of characters. Example 1: Inp ...

  9. abc356

    D1.5h没做出,E0.5h做出来啦? E 有两个做法,第一个是枚举分子来计算分母对答案的贡献,另一种是枚举分母来求分子对答案的贡献. 枚举分子来计算分母对答案的贡献需要用到数论分块,所以我们讲枚举分 ...

  10. el-upload拍照上传多个文件报错 ERR_UPLOAD_FILE_CHANGED问题

    最近同事使用el-upload上传图片时出现一个问题,连续拍照多个图片的时候,循环调用接口上传会报错: ERR_UPLOAD_FILE_CHANGED,网上找了很多方案没有解决,下面是我自己的解决过程 ...