通俗易懂搞定forEach和map的区别和使用

前言

在前端开发的时候,我们有时候需要对后端传过来的数组的进行相应的遍历处理,但是很多小伙伴对map和forEach两个方法的界限还是有模糊,本文从具体的示例来弄清楚两者的相同点和不同点

相同点

1.都是用于遍历数组的方法,可以对数组中的每个元素执行相应的操作。
2.都接受一个回调函数作为参数,该回调函数会在遍历数组的每个元素时被调用。
3.回调函数都可以接受三个参数:当前遍历的元素、当前元素的索引和被遍历的数组本身。
4.只能循环数组

例如以下代码


function App() {const fruits = ['Apple', 'Banana', 'Orange'];const fruitList: JSX.Element[] = [];fruits.forEach((fruit, index) => {fruitList.push(<li key={index}>{fruit}</li>);});return (<div className="App"><h1>Fruits:</h1><ul>{fruitList}</ul></div>);
}export default App;

在界面上我们可以看见水果列表被渲染出来了
在这里插入图片描述
那么在这里我们将foreach改变为map行不行能,答案是可以的


function App() {const fruits = ['Apple', 'Banana', 'Orange'];const fruitList: JSX.Element[] = [];fruits.map((fruit, index) => {fruitList.push(<li key={index}>{fruit}</li>);});return (<div className="App"><h1>Fruits:</h1><ul>{fruitList}</ul></div>);
}export default App;

结果也是同样渲染
在这里插入图片描述
两者都可以循环遍历数组的每一项将jsx元素存入新数组里,在对一个数组进行遍历时,不需要返回新数组和不需要改变原数组时,两者方法都可以用

不同点

1.map有返回值,返回新数组
2.foreach没有返回值,改变原数组

例如以下代码


function App() {const fruits = ['Apple', 'Banana', 'Orange'];const fruitList = fruits.map((fruit, index) => (<li key={index}>{fruit}</li>));return (<div className="App"><h1>Fruits:</h1><ul>{fruitList}</ul></div>);
}export default App;

在这里我们可以通过一个变量fruitList接收原数组使用map方法之后返回的新数组,在渲染的时候渲染的是新数组
在这里插入图片描述
如果将map改为了foreach,在渲染变量数组时会报错,这是因为forEach方法返回的是void,而不是一个可渲染的React元素,如果强制将变量的类型改为any,虽然没有报错,但是界面上不会渲染列表,因为这个方法没有返回值
在这里插入图片描述
所以说遍历渲染组件或者节点时需要使用map方法进行渲染会方便一些,而foreach则需要重新定义一个数组将遍历的值push进去

再举一个foreach改变原数组而map不改变原数组的例子

function App() {const data = [1, 2, 3, 4, 5];data.forEach((num, index, array) => {array[index] = num * 2;});return (<div className="App"><h1>{data}</h1></div>);
}export default App;

使用foreach遍历对原数组的索引项的值进行乘2操作,直接对data进行了改变
在这里插入图片描述
但是需要注意的是,这里将foreach改为map后仍然在界面上输出的是246810,因为也是通过回调函数遍历对原数组做了赋值处理,而map在使用时通常通过一个变量接收返回的新数组


function App() {const data = [1, 2, 3, 4, 5];const data2 = data.map((num) => {return num * 2;});return (<div className="App"><h1>{data}</h1><h1>{data2}</h1></div>);
}export default App;

在这里插入图片描述
可以看到原数组的值不会发生变化,返回的新数组的值乘2渲染界面

总结

map方法通常用于遍历渲染组件或节点,通过一个新的变量接收返回的新数组,需要返回值,而foreach方法通常在对原数组进行操作的情况且不需要返回值的遍历情况下使用,大多数情况下使用两者遍历数组进行操作都是可以的

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

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

相关文章

《Linux 简易速速上手小册》第1章: Linux 系统基础(2024 最新版)

文章目录 1.1 Linux 操作系统概述1.1.1 重点基础知识1.1.2 重点案例&#xff1a;配置 Apache Web 服务器1.1.3 拓展案例 1&#xff1a;配置 SSH 服务以进行远程管理1.1.4 拓展案例 2&#xff1a;使用 Cron 定时任务 1.2 选择合适的 Linux 发行版1.2.1 重点基础知识1.2.2 重点案…

腾讯云幻兽帕鲁服务器配置怎么选择合适?

腾讯云幻兽帕鲁服务器配置怎么选&#xff1f;根据玩家数量选择CPU内存配置&#xff0c;4到8人选择4核16G、10到20人玩家选择8核32G、2到4人选择4核8G、32人选择16核64G配置&#xff0c;腾讯云百科txybk.com来详细说下腾讯云幻兽帕鲁专用服务器CPU内存带宽配置选择方法&#xff…

理解JAVA命名和目录接口(JNDI)

理解JAVA命名和目录接口(JNDI) 考虑访问网站的场景,Web用户要求记住四字节的IP地址而不是有意义的名称。例如,假设Web用户用123.23.3.123而不是hotmail.com访问hotmail网站。在这种情形下,Web用户难以记住不同的IP地址来访问不同的网站。因此,要使其变得对Web用户简单方…

Vue3高频知识点和写法

一 Vue插件 二 vue3项目创建 创建完成后npm install npm run dev 三 setup 一 响应式数据 setup函数是用来代替data和methods的写法的&#xff0c;在setup函数中声明的数据和函数&#xff0c;导出后可以在页面中使用。 但是暂时不是响应式数据&#xff0c;如果要响应式数据的…

单片机学习笔记---AT24C02数据存储

目录 AT24C02数据存储 准备工作 代码讲解 I2C.c 模拟起始位置的时序 模拟发送一个字节的时序 模拟接收应答的时序 模拟接收一个字节的时序 模拟发送应答的时序 模拟结束位置的时序 I2C.h AT24C02.c 字节写&#xff1a;在WORD ADDRESS&#xff08;字地址&#xff…

Verilog刷题笔记29

题目&#xff1a; Create a 100-bit binary ripple-carry adder by instantiating 100 full adders. The adder adds two 100-bit numbers and a carry-in to produce a 100-bit sum and carry out. To encourage you to actually instantiate full adders, also output the ca…

【教3妹学编程-算法题】输入单词需要的最少按键次数 I

3妹&#xff1a;2哥&#xff0c;新年好鸭~ 2哥 : 新年好&#xff0c;3妹这么早啊 3妹&#xff1a;是啊&#xff0c;新年第一天要起早&#xff0c;这样就可以起早一整年 2哥 :得&#xff0c;我还不了解你&#xff0c;每天晒到日上三竿 3妹&#xff1a;嘿嘿嘿嘿&#xff0c;一年是…

【数据结构】链表OJ面试题4《返回链表入环的第一个结点》(题库+解析)

1.前言 前五题在这http://t.csdnimg.cn/UeggB 后三题在这http://t.csdnimg.cn/gbohQ 给定一个链表&#xff0c;判断链表中是否有环。http://t.csdnimg.cn/Rcdyc 记录每天的刷题&#xff0c;继续坚持&#xff01; 2.OJ题目训练 10. 给定一个链表&#xff0c;返回链表开始…

TCP和UDP相关问题(重点)——8.TCP的拥塞控制怎么实现的?

在某段时间内&#xff0c;若对网络中某一资源的需求超过了该资源所能提供的可用部分&#xff0c;网络性能就会变坏&#xff0c;比如在高速公路上行驶的车辆&#xff0c;如果一时期内涌入了太多的车辆&#xff0c;道路将变得拥堵&#xff0c;交通状况变差。网络中也是一样&#…

CTFshow web(php命令执行 68-71)

web68 还是那句话&#xff0c;没看到flag在哪&#xff0c;那就优先找到flag位置 这里cvar_dump(scandir("/")); 直接输出根目录的位置&#xff0c;然后查看源代码&#xff0c;发现flag位置为flag.txt 知道flag在根目录下面的flag.txt直接访问就好了 cinclude(/flag…

【北邮鲁鹏老师计算机视觉课程笔记】07 Local feature-Blob detection

【北邮鲁鹏老师计算机视觉课程笔记】07 Local feature-Blob detection 1 实现尺度不变性 不管多近多远&#xff0c;多大多小都能检测出来 找到一个函数&#xff0c;实现尺度的选择特性 2 高斯偏导模版求边缘 做卷积 3 高斯二阶导拉普拉斯 看哪个信号能产生最大响应 高斯…

营销平台分享

上面几个阶段的用户分别是新用户、未激活用户、活跃用户、沉默用户、流失用户&#xff0c;具体流转关系如下图所示。 新用户如果长时间没有下单就变成了未激活用户&#xff0c;新用户如果有下单就变成了活跃用户&#xff0c;活跃用户如果隔一段时间没有下单就变成了沉默用户&a…