JavaScript 数组方法 reduce() 的用法

   

  一、概述   

在JavaScript中,reduce()方法是一个非常实用的数组方法,它接收一个函数作为累加器(accumulator),数组中的每个值(从左到右)开始缩减,最终为一个值。这个方法在处理数组元素时,将每个元素依次传入函数中进行处理,并将处理结果累积起来,最终得到一个单一的输出值。

reduce() 方法的基本语法如下:

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

让我们详细解释一下这个方法的参数:

  1. total:这是累加器,也是最终的返回值。
  2. currentValue:当前正在处理的元素。
  3. currentIndex:当前元素的索引。如果省略,则视为应用在数组的元素上,而不是在索引上。
  4. arr:调用 reduce() 的数组。
  5. initialValue:可选参数,为第一次调用回调函数时提供“初始值”。

二、使用场景

现在让我们通过一些示例来学习如何使用 reduce() 方法。

计算数组元素的总和

我们可以使用 reduce() 方法来计算数组元素的总和。以下是一个简单的例子:

const numbers = [1, 2, 3, 4, 5];  
const sum = numbers.reduce((accumulator, currentValue) => accumulator + currentValue);  
console.log(sum); // 输出:15

        在这个例子中,我们没有提供初始值,因此第一次调用回调函数时累加器的值为 undefined。之后的每一次调用中,累加器都是之前调用的返回值,而当前值是数组的下一个元素。因此,最终的结果是数组中所有元素的和。

如果提供了初始值,那么第一次调用回调函数时的累加器将是初始值,而不是 undefined。例如:

const numbers = [1, 2, 3, 4, 5];  
const sum = numbers.reduce((accumulator, currentValue) => accumulator + currentValue, 0);  
console.log(sum); // 输出:15

在这个例子中,我们将初始值设为0,所以第一次调用回调函数时的累加器就是0,然后我们将这个结果与数组的下一个元素相加,以此类推,直到遍历完整个数组。最终的结果仍然是数组中所有元素的和。

将数组元素转换为新的数据结构

reduce()方法还可以用于将数组元素转换为新的数据结构。下面是一个示例:

const items = [{ id: 1, name: 'Item 1' }, { id: 2, name: 'Item 2' }, { id: 3, name: 'Item 3' }];  
const itemIds = items.reduce((accumulator, currentItem) => accumulator.concat(currentItem.id), []);  
console.log(itemIds); // 输出:[1, 2, 3]

在这个示例中,我们将一个函数作为参数传递给reduce()方法,这个函数接收两个参数:累加器(accumulator)和当前值(currentItem)。累加器是已经累积的结果,当前值是当前正在处理的数组元素。我们将当前元素的id属性连接起来,并将结果返回作为下一次调用的累加器。最终,我们将累加器的初始值设置为一个空数组,并得到包含所有元素的id属性的新数组。

转换数组为对象

        使用reduce()方法可以将数组转换为对象。通过传递一个回调函数,我们可以指定如何将数组元素转换为对象属性值。回调函数的第一个参数是累加器,第二个参数是当前元素值,第三个参数是当前元素的索引。

const arr = ['a', 'b', 'c'];  
const obj = arr.reduce((accumulator, currentValue, currentIndex) => {  accumulator[currentValue] = currentIndex;  return accumulator;  
}, {});  
console.log(obj); // 输出:{ a: 0, b: 1, c: 2 }

检查数组中是否存在某个元素

        虽然Array.prototype.includes()方法可以用来检查数组中是否存在某个元素,但使用reduce()方法也可以实现相同的功能。通过将回调函数的返回值设置为累加器,我们可以在循环结束后检查累加器的值来确定是否存在某个元素。

const numbers = [1, 2, 3, 4, 5];  
const found = numbers.reduce((accumulator, currentValue) => {  if (currentValue === 3) {  return true;  } else {  return accumulator;  }  
}, false);  
console.log(found); // 输出:true

提取对象中键名相同的属性值

        有时候我们需要从对象中提取所有键名相同的属性值。使用reduce()方法可以很方便地实现这个功能。通过传递一个回调函数,我们可以将对象的每个属性值作为累加器的初始值,并将每个属性名作为当前值传递给回调函数。在回调函数中,我们可以将当前属性值添加到累加器中,并返回更新后的累加器。

const obj = { a: 1, b: 2, c: 3, d: { e: 4 } };  
const values = Object.values(obj).reduce((accumulator, currentValue) => {  if (typeof currentValue === 'number') {  accumulator.push(currentValue);  }  return accumulator;  
}, []);  
console.log(values); // 输出:[1, 2, 3, 4]

三、总结

        总之,reduce()方法是JavaScript中非常实用的数组操作方法,它可以用来简化数组并执行各种复杂的操作。通过使用适当的回调函数,我们可以将数组的每个元素转换为我们需要的任何形式的数据结构。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/198998.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

OpenTelemetry系列 - 第4篇 OpenTelemetry K8S生态

目录 一、【Helm】添加OTel Helm repo二、【Helm Chart】OTel Collector2.1 daemonset2.2 deloyment 三、【K8S Operator】OTel Operator3.1 安装OTel Operator3.2 部署OpenTelemetryCollector3.2.1 Deloyment Mode3.2.2 DeamonSet Mode3.2.3 StatefulSetMode3.2.4 Sidecar Mod…

基于SUMO和强化学习的交通优化

本文旨在解释强化学习方法如何通过 TraCl 与 SUMO 配合使用,以及这如何有利于城市交通管理和自动驾驶车辆的路径优化。 NSDT工具推荐: Three.js AI纹理开发包 - YOLO合成数据生成器 - GLTF/GLB在线编辑 - 3D模型格式在线转换 - 可编程3D场景编辑器 - REV…

Node包管理工具 - nvm、npm、yarn、cnpm、pnpm

转载说明 原文地址 简介 nvm : 可以实现一台电脑,拥有多个版本的Node npm : node package manager 下载Node后自带的一个包管理工具 yarn : npm 的升级版,更优秀 cnpm : 配置下载非官方地址的依赖(淘宝、华为、腾讯镜像) pnpm :…

day70

今日回顾 session 中间件 auth session Cookie虽然在一定程度上解决了“保持状态”的需求,但是由于Cookie本身最大支持4096字节,以及Cookie本身保存在客户端,可能被拦截或窃取,因此就需要有一种新的东西,它能支持更…

辛普森距离(SD,Sampson Distance)

定义 Sampson误差是复杂性介于代数误差和几何误差之间,但非常近似于几何误差的一种误差。 应用 SLAM对极几何中使用到SD来筛选内点: 1.随机采样8对匹配点 2.8点法求解基础矩阵 ​; 3.奇异值约束获取基础矩阵F; 4.计算误差&…

通达信指标公式19:龙虎榜股票池——主力控盘度的计算方法

0.小红牛本指标,选股的思路说明:控盘度,又称主力控盘,是指主力控制了某只股票的大部分流通股,从而控制了股票的价格。主力控盘的目的通常是为了获取更多的收益,通过控制股票价格来实现其策略。所以首要分析…

(04730)电路分析基础之电阻、电容及电感元件

04730电子技术基础 语雀(完全笔记) 电阻元件、电感元件和电容元件的概念、伏安关系,以及功率分析是我们以后分析电 路的基础知识。 电阻元件 电阻及其与温度的关系 电阻 电阻元件是对电流呈现阻碍作用的耗能元件,例如灯泡、…

外包干了2个月,技术倒退2年。。。。。

先说一下自己的情况,本科生,20年通过校招进入深圳某软件公司,干了接近4年的功能测试,今年国庆,感觉自己不能够在这样下去了,长时间呆在一个舒适的环境会让一个人堕落!而我已经在一个企业干了四年的功能测试…

现代版“田忌赛马”:IPMT如何实现资源利用最大化

摘要:在流程调整和产品重整过程中,IPMT发挥了至关重要的作用。IPMT是什么?它的职责到底是什么?每个公司必须要有IPMT吗? 1992年,IBM在激烈的市场竞争下,遭遇到了严重的财政困难,利润…

机器学习-ROC曲线:技术解析与实战应用

本文全面探讨了ROC曲线(Receiver Operating Characteristic Curve)的重要性和应用,从其历史背景、数学基础到Python实现以及关键评价指标。文章旨在提供一个深刻而全面的视角,以帮助您更好地理解和应用ROC曲线在模型评估中的作用。…

【新手解答8】深入探索 C 语言:递归与循环的应用

C语言的相关问题解答 写在最前面问题:探索递归与循环在C语言中的应用解析现有代码分析整合循环示例代码修改注意事项结论 延伸:递归和循环的退出条件设置解析使用递归使用循环选择适合的方法 写在最前面 一位粉丝私信交流,回想起了当初的我C…

Zabbix HA高可用集群搭建

Zabbix HA高可用集群搭建 Zabbix HA高可用集群搭建一、Zabbix 高可用集群(Zabbix HA)二、部署Zabbix高可用集群1、两个服务端配置1.1主节点 Zabbix Server 配置1.2 备节点 Zabbix Server 配置1.3 主备节点添加监控主机1.4 查看高可用集群状态 2、两个客户…

【数据结构与算法】JavaScript实现二叉搜索树

文章目录 一、二叉搜索树的封装1.插入数据2.遍历数据2.1.先序遍历2.2.中序遍历2.3.后续遍历 3.查找数据3.1.查找最大值&最小值3.2.查找特定值 4.删除数据4.1.情况1:没有子节点4.2.情况2:有一个子节点4.3.情况3:有两个子节点4.4.完整实现 …

成为AI产品经理——回归模型评估(MSE、RMSE、MAE、R方)

分类问题的评估是看实际类别和预测类别是否一致,它的评估指标主要有混淆矩阵、AUC、KS。回归问题的评估是看实际值和预测值是否一致,它的评估指标包括MAE、MSE、RMSE、R方。 如果我们预测第二天某支股票的价格,给一个模型 y1.5x,…

查询绑定了所有id的name

1、如图,绑定了所有id的有A,B两个name 2、第一种Sql及效率 explain SELECT name,count(id) as count from test GROUP BY name HAVING count(id)(SELECT count(DISTINCT id) from test); 3、第二种sql及效率 explain select * from (SELECT name,count(id) as co…

SQL自学通之简介

目录 一、SQL 简史 二、数据库简史 1、Dr. Codds 对关系型数据库系统的十二条规则 2、设计数据库的结构 3、数据库的前景 4、对于什么是客户机/服务器型电脑系统 BernardH.Boar的定义如下: 5、交互式语言 6、易于实现 7、SQL 总览 三、流行的 SQL 开发工具…

MFC 绘制单一颜色圆形、渐变颜色边框圆形、渐变填充圆形以及绘制三角函数正弦函数曲线.

MFC 绘制三种不同圆形以及绘制正弦函数曲线 本文使用visual Studio MFC 平台实现绘制单一颜色圆形、渐变颜色边框圆形、渐变填充圆形以及绘制三角函数正弦函数曲线. 关于基础工程的创建请参考 01-Visual Studio 使用MFC 单文档工程绘制单一颜色直线和绘制渐变颜色的直线 02-vis…

【【FPGA 之 MicroBlaze XADC 实验】】

FPGA 之 MicroBlaze XADC 实验 Vivado IP 核提供了 XADC 软核,XADC 包含两个模数转换器(ADC),一个模拟多路复用器,片上温度和片上电压传感器等。我们可以利用这个模块监测芯片温度和供电电压,也可以用来测…

【五分钟】熟练使用np.interp函数函数(干货!!!)

引言 np.interp函数可对一维数组进行线性插值。具体来说,如果已知xp和yp,并且xp和yp具有确定的对应关系(比如ypsin(xp)),那么对于新的一维数组x,可通过np.interp函数得到数组y,y是基于 xp和yp的映射关系 通过【线性插…

Spring之AOP理解与应用

1. AOP的认识 面向切面编程:基于OOP基础之上新的编程思想,OOP面向的主要对象是类,而AOP面向的主要对象是切面,在处理日志、安全管理、事务管理等方面有非常重要的作用。AOP是Spring中重要的核心点,AOP提供了非常强…