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 使您有能力向对象添加属 ...
随机推荐
- tcc-transaction源码详解
更多优秀博文,请关注博主的个人博客:听到微笑的博客 本文主要介绍TCC的原理,以及从代码的角度上分析如何实现的:不涉及具体使用示例.本文通过分析tcc-transaction源码带大家了解TCC分布式 ...
- Google,Baidu,Bing三大搜素引擎图片爬虫
Google,Baidu,Bing三大搜素引擎图片爬虫 参考https://mp.weixin.qq.com/s/75QDjRTDCKzuM68L4fg5Lg 这个爬虫由ID为sczhengyabin ...
- mysql通过binlog来恢复被删除的数据库
binlog日志 查询: MariaDB [(none)]> show variables like 'log_bin'; +---------------+-------+ | Variabl ...
- 手把手教你免费用Flashduty做消息通知
为什么需要消息通知? 如果有重要的情况发生,希望能通过各种媒介通知我们.可以举几个例子: 家里燃气费没有了,希望能有短信或者app通知 api频繁500报错,希望及时感知,及时修复 公司网站是http ...
- C程序函数调用&系统调用
理解程序的执行 我们要知道CPU可以自由地访问寄存器.内存.另外,程序是由操作系统执行的,所以操作系统能够控制程序的所有执行情况,限制程序的行为. 程序地执行过程: 程序是一个二进制文件,包含程序的代 ...
- 解读surging 的内存过高的原因
前言 对于.NET开发人员来讲,一个程序占用内存过高,是极其糟糕,是一款不合格的程序软件,.NET开发人员也不会去使用服务器垃圾收集器(ServerGarbageCollection),而是选用工作站 ...
- 在js、vue中使用方法调用a标签
<el-button type="primary" style="width:130px" @click="shout"> &l ...
- WPF/C#:显示分组数据的两种方式
前言 本文介绍自己在遇到WPF对数据进行分组显示的需求时,可以选择的两种方案.一种方案基于ICollectionView,另一种方案基于IGrouping. 基于ICollectionView实现 相 ...
- Hive怎么调整优化Tez引擎的查询?在Tez上优化Hive查询的指南
目录 在Tez上优化Hive查询的指南 调优指南 理解Tez中的并行化 理解mapper数量 理解reducer数量 并发 案例1:未指定队列名称 案例2:指定队列名称 并发的指南/建议 容器复用和预 ...
- shell中各个括号的用法区别
在 shell 脚本中,[ ].[[ ]].( ).(( )).{ } 和 {{ }} 都有各自特定的用法和区别.下面是对这些结构的详细解释: 1. [ ] (test 命令) [ ] 是 shell ...