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. 20220314线上panic总结

    panic: runtime error: invalid memory address or nil pointer dereference [signal SIGSEGV: segmentatio ...

  2. nginx日志缓存open_log_file_cache

    nginx日志缓存,提升磁盘性能 将多个日志进行积累,达到一定量级后写入到磁盘,可以减少磁盘旋转,从而降低磁盘i/o,提升nginx能效 语法: access_log path access_log ...

  3. DP Record

    从 2024/5/4 往后开始记录捏. T1. 给你一棵树,定义一个集合的权值为 \(\dfrac{\sum_{x\in S}V_x}{\sum_{x\in S}C_x}\).若一个点 \(\in S ...

  4. 手摸手教你把Ingress Nginx集成进Skywalking

    背景 在微服务大行其道的今天,如何观测众多微服务.快速理清服务间的依赖.如何对服务之间的调用性能进行衡量,成了摆在大家面前的难题.对此,Skywalking应运而生,它是托管在 Apache 基金会下 ...

  5. winform遍历控件的Controls.OfType<>方法

    页面TextBox控件较多时,可以使用类似的名字,方便遍历时整体的修改,可以使用Controls.OfType<TextBox>()获取所有文本框: 需要引用命名空间System.Linq ...

  6. 手把手教你搭建Docker私有仓库Harbor

    1.什么是Docker私有仓库 Docker私有仓库是用于存储和管理Docker镜像的私有存储库.Docker默认会有一个公共的仓库Docker Hub,而与Docker Hub不同,私有仓库是受限访 ...

  7. Vue学习:16.组件通信

    组件通信就是指组件之间的数据传递.由于组件的数据是独立的,无法直接访问其他组件的数据,所以想要使用其他组件数据必须通过 组件通信! 在Vue.js中,组件之间的通信可以通过多种方式实现,包括 prop ...

  8. mybatis sqlmap sql in 查询

    <select id="selectBlogs" parameterType="map"> SELECT * FROM blog WHERE use ...

  9. java elasticsearch-rest-high-level-client 根据歌名搜索,创建索引,根据索引ID搜索

    1.pom 导入jar <dependency> <groupId>org.elasticsearch.client</groupId> <artifactI ...

  10. python批量读取excel csv文件插入mysql数据库

    #python批量读取excel csv文件插入mysql数据库 import os import csv import argparse import pymysql import sys clas ...