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 使您有能力向对象添加属 ...
随机推荐
- TDSQL数据库考试实操题
第一题: 演练二 物理备份(5分) 答: 第二题:2. 演练一 请根据给定的演练方案,进行相关演练,并按如下要求提交截图 主备切换(5分) 答: 第三题:3. 演练一 请根据给定的演练方案,进行相关演 ...
- itest work 开源接口测试&敏捷测试管理平台 9.5.0 GA_u4发布,优化及修复BUG
(一)itest work 简介 itest work (爱测试) 一站式工作站让测试变得简单.敏捷,"好用.好看,好敏捷" ,是itest wrok 追求的目标.itest w ...
- 查看SO KO 执行程序相关信息命令
1 查看SO 查看so库的方法__臣本布衣_新浪博客 (sina.com.cn) 1.nm -D libxxx.so 打印出符号信息. 一般这样用:nm -D libxxx.so |grep T $ ...
- Vue 3 Teleport:掌控渲染的艺术
title: Vue 3 Teleport:掌控渲染的艺术 date: 2024/6/5 updated: 2024/6/5 description: 这篇文章介绍了Vue3框架中的一个创新特性--T ...
- 剑指Offer-55.链表中环的入口结点(C++/Java)
题目: 给一个链表,若其中包含环,请找出该链表的环的入口结点,否则,输出null. 分析: 利用快慢指针,如果链表中存在环的话,则快指针一定在环中的某个节点与慢指针相遇. 设头节点到链表的环的入口结点 ...
- kettle从入门到精通 第三十课 mysql 数据连接常用配置
1.我们平常用的最多的数据库就是mysql了,这里我以mysql为例说下数据库连接池配置.为啥要用连接池,因为数据库建立连接很费性能,所以就建立连接池(提前建立好一批连接)缓存起来提高性能.下图中my ...
- 夜莺项目发布 v6.1.0 版本,增强可观测性数据串联
大家好,夜莺项目发布 v6.1.0 版本,这是一个中版本迭代,不止是 bugfix 了,而是引入了既有功能的增强.具体增强了什么功能,下面一一介绍. 1. 增强可观测性数据串联 从 v6.1.0 开始 ...
- Vue学习:16.组件通信
组件通信就是指组件之间的数据传递.由于组件的数据是独立的,无法直接访问其他组件的数据,所以想要使用其他组件数据必须通过 组件通信! 在Vue.js中,组件之间的通信可以通过多种方式实现,包括 prop ...
- ENSP的VirtualBox虚拟网卡不能用
VirtualBox 安装好后本地会新建一个名为 "VirtualBox Host-Only Network" 的虚拟网卡,虚拟机可以通过这个虚拟网卡网卡和物理机通信.但ENSP有 ...
- Java面试知识点(三)Java中的单继承和多继承
多继承的优缺点 优点:对象可以调用多个父类中的方法 缺点:如果派生类所继承的多个父类有相同的父类(也就是一个菱形继承结构),而派生类对象需要调用这个祖先类的方法,就会容易出现二义性. 1.java 与 ...