JavaScript高级~数组方法reduce
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的更多相关文章
- Javascript中数组方法reduce的妙用之处
Javascript数组方法中,相比map.filter.forEach等常用的迭代方法,reduce常常被我们所忽略,今天一起来探究一下reduce在我们实战开发当中,能有哪些妙用之处,下面从red ...
- 几个关于js数组方法reduce的经典片段
以下是个人在工作中收藏总结的一些关于javascript数组方法reduce的相关代码片段,后续遇到其他使用这个函数的场景,将会陆续添加,这里作为备忘. javascript数组那么多方法,为什么我要 ...
- JavaScript Array 数组方法汇总
JavaScript Array 数组方法汇总 1. arr.push() 从后面添加元素,返回值为添加完后的数组的长度 var arr = [1,2,3,4,5] console.log(arr.p ...
- JavaScript数组方法--reduce、reduceRIght、reverse
今天写的reduce是比较复杂的一个数组方法,其实在这之前我也用过reduce,可是每次用起来总感觉不那么顺手,主要还是因为不熟,对reduce本身不熟.首先reduce这个单词翻译为中文,不那么直观 ...
- JavaScript Array数组方法详解
Array类型是ECMAScript中最常用的引用类型.ECMAScript中的数据与其它大多数语言中的数组有着相当大的区别.虽然ECMAScript中的数据与其它语言中的数组一样都是数据的有序列表, ...
- ES5 数组方法reduce
reduce() 方法接收一个函数作为累加器(accumulator),数组中的每个值(从左到右)开始合并,最终为一个值. 参数 callback 执行数组中每个值的函数,包含四个参数 previou ...
- JavaScript之数组方法整理
Array概述 除了Object类型,最常用的类型: 实质:有序的数据列表, 特性:可以动态的调整数组的大小 创建数组的两种方式 构造函数创建方式 var arr = ...
- JavaScript常用数组方法
JavaScript数组方法有以下这些: forEach() 方法对数组的每一个元素执行一次提供的函数. map() 方法创建一个新数组,其结果是该数组都执行一次函数,原函数保持不变. filter( ...
- JavaScript的数组方法(array)
数组方法: 1. concat() 合并数组 2. join() 将数组的元素拼接成字符串,并指定分隔符 3. push() 往数组末尾添加一个元素,并返回新的数组的长度 4. reverse( ...
- 【JavaScript】数组方法之基础方法
数组方法之基础方法 Array 对象属性 属性 描述 constructor 返回对创建此对象的数组函数的引用. length 设置或返回数组中元素的数目. prototype 使您有能力向对象添加属 ...
随机推荐
- swagger 的配置
1,开启swagger : c.IncludeXmlComments(GetXmlCommentsPath()); protected static string GetXmlCommentsPath ...
- python垃圾回收和缓存管理
Python垃圾回收和缓存管理 你有没有想过为什么我们频繁地使用Python敲代码做项目,实际上一直在生产对象并不断占用内存,而我们很少会去清理Python的内存,理论上来讲它总有一天把内存消耗殆尽( ...
- MyBatis一对多或多对多分页查询的结果条数不符合预期的问题解决
问题描述 通常我们我们在单表查询中我们可以采用limit进行分页查询,这样可以减少页面的显示量,加快页面想应速度.但是在MyBatis框架中,如果我们在一对多或多对多查询中直接使用limit关键字 ...
- js 中你不知道的各种循环测速
在前端 js 中,有着多种数组循环的方式: for 循环: while 和 do-while 循环: forEach.map.reduce.filter 循环: for-of 循环: for-in 循 ...
- nginx002: NGINX的环境变量,基本命令参数,目录关系及gzip优化
NGINX的环境变量,基本命令参数,目录关系及gzip优化 添加环境变量 nginx命令执行方式 nginx [选项] [参数] 通过编译安装的nginx 默认是没有环境变量的,如何设置环境变量,让n ...
- makedown快速入门
Makedown学习 Makedown 作为一个强大文本编辑语言,学习并熟悉应用是写好一篇优秀博客的基础 那么接下来我将介绍makedown语言最常用的几个语法 标题 +"space&quo ...
- C语言打印数字前补0
1.要求说明 例如有个数据为a = 0x10,要求打印输出为0x000010. 2.实现 1 #include <stdio.h> 2 3 4 int main() 5 { 6 int a ...
- this的二种使用方式
package com.ht.TestThis; public class TestThisKey { public static void main(String[] args) { // TODO ...
- kettle从入门到精通 第六十六课 ETL之kettle kettle阻塞教程,轻松获取最后一行数据,so easy
场景:ETL沟通交流群内有小伙伴反馈,如何在同步一批数据完成之后记录下同步结果呢?或者是调用后续步骤.存储过程.三方接口等. 解决:使用步骤Blocking step进行阻塞处理即可. 1.下面的de ...
- 内部网关协议RIP-路由选择协议
路由信息协议RIP(Routing Information Protocol)是内部网关协议IGP中最先得到广泛使用的协议,其相关标准文档为RFC1058. 一.RIP基本工作原理 RIP要求自治系统 ...