问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

如何跳出foreach递归循环

发布网友 发布时间:2022-04-21 17:39

我来回答

3个回答

懂视网 时间:2022-05-14 16:09

探究为什么break和return不行

先看看为什么return没有效果,break报错,forEach的实现方式用代码表示出来可以写成如下的结构

const arr = [1, 2, 3, 4, 5];
for (let i = 0; i < arr.length; i++) {
 const rs = (function(item) {
 console.log(item);
 if (item > 2) return false;
 })(arr[i])
}

使用return语句相当于在每个自执行函数中将返回值复制给rs,但是实际对整个函数并没有影响。而使用break语句报错是因为再JS的解释器中break语句是不可以出现在函数体内的。

如何变通跳出forEach循环

MDN官方推荐的方法

// every在碰到return false的时候,中止循环。some在碰到return ture的时候,中止循环。
var a = [1, 2, 3, 4, 5]
a.every(item=>{
 console.log(item); //
输出:1,2 if (item === 2) { return false } else { return true } }) var a = [1, 2, 3, 4, 5] a.some(item=> { console.log(item); //输出:1,2 if (item === 2) { return true } else { return false } })

其他方法

1.使用for循环或者for in 循环代替

2.使用throw抛出异常

try {
 [1, 2, 3, 4, 5].forEach(function(item) {
 if (item=== 2) throw item;
 console.log(item);
 });
} catch (e) {}

3.使用判断跑空循环

var tag;
[1, 2, 3, 4, 5].forEach(function(item){
 if(!tag){
 console.log(item);
 if(item===2){
  tag=true;
 }
 }

这样做有两个问题,第一个问题,全局增加了一个tag变量,第二个问题,表面上看是终止了forEach循环,但是实际上循环的次数并没有改变,只是在不满足条件的时候callback什么都没执行而已,先来解决第一个问题,如何删除全局下新增的tag变量 。实际上forEach还有第二个参数,表示callback的执行上下文,也就是在callback里面this对应的值。因此我们可以讲上下文设置成空对象,这个对象自然没有tag属性,因此访问this.tag的时候会得到undefined

[1, 2, 3, 4, 5].forEach(function(item){
 if(!this.tag){
 console.log(item);
 if(item===2){
  this.tag=true;
 }
 }
},{})

4.修改索引

var array=[1, 2, 3, 4, 5]
array.forEach(item=>{
 if (item == 2) {
 array = array.splice(0);
 }
 console.log(item);
})

讲解:

forEach的执行细节

1.遍历的范围在第一次执行callback的时候就已经确定,所以在执行过程中去push内容,并不会影响遍历的次数,这和for循环有很大区别,下面的两个案例一个会造成死循环一个不会

var arr=[1,2,3,4,5]
//会造成死循环的代码
for(var i=0;i<arr.length;i++){
 arr.push('a')
}
//不会造成死循环
arr.forEach(item=>arr.push('a'))

2.如果已经存在的值被改变,则传递给 callback 的值是 forEach 遍历到他们那一刻的值。

var arr=[1,2,3,4,5];
arr.forEach((item,index)=>{
 console.log(`time ${index}`)
 arr[index+1]=`${index}a`;
 console.log(item)
})

3.已删除的项不会被遍历到。如果已访问的元素在迭代时被删除了(例如使用 shift()),之后的元素将被跳过。

var arr=[1,2,3,4,5];
arr.forEach((item,index)=>{
 console.log(item)
 if(item===2){
 arr.length=index;
 }
})

在满足条件的时候将后面的值截掉,下次循环的时候照不到对应的值,循环就结束了,但是这样操作会破坏原始的数据,因此我们可以使用一个小技巧,即将数组从0开始截断,然后重新赋值给数组也就是array=array.splice(0)。

本篇文章到这里就已经全部结束了,更多其他精彩内容可以关注PHP中文网的JavaScript教程视频栏目!

热心网友 时间:2022-05-14 13:17

跳出循环用 break 或 continue , 我想,你肯定是要 return 值到函数外面,foreach 因为没有返回值,所有不适合做递归,当然你不要返回值也能做。
如果需要递归最后返回值 ,那用 for 或 while 这些没有 function 作用域的循环,最后 return 返回值就行 (一层一层的往外return)。
你要了解递归的特点,递进去,还要归出来

热心网友 时间:2022-05-14 14:35

 递归算法的特点
  递归过程一般通过函数或子过程来实现。
  递归算法:在函数或子过程的内部,直接或者间接地调用自己的算法。
  递归算法的实质:是把问题转化为规模缩小了的同类问题的子问题。然后递归调用函数(或过程)来表示问题的解。
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
最新的PS3与FF13同捆版主机编号CECH-2007B可以播放全区的蓝光碟么? 一个有关PS3同捆问题 我电脑的CPU使用跳动幅度很大,谁能告诉我怎么回事啊? 谁能告诉我的电脑是怎么回事 开机了正常 就是该显示桌面的图标时候十来... 谁能告诉一下 我打开电脑到桌面时出现这样 是怎么回事啊 电脑一开机就出这个谁知道怎么回事啊! 我的x7plus没有信号。 电话交换机设置教程 程控电话交换机怎么设置 程控数字交换机功能 程控交换机如何配置 长城炮越野版用的什么差速锁?极限输出可以达到多少? 长城推出“炮”系列,标语是“拒绝坦途”,三把差速锁... 三把差速锁、蠕行模式,长城炮越野皮卡将于第二季... 3把锁,4吨拖拽,7种全地形模式,长城炮越野皮卡有... 长城炮越野版街头现身,自带涉水喉+绞盘+AT胎,还... 长城炮越野皮卡有何优势?10年老司机:原厂三把锁... 创作的过程=我今年毕业=求如题毕业论文或者毕业设... 全系标配三把锁+涉水喉,外形更硬派,长城炮越野皮... 新教师考核的指导教师意见、班主任意见怎么写? 三把差速锁/越野能力强悍 长城炮越野版4月上市 7种驾驶模式,顶配不到20万配三把锁!试驾长城炮 论文开题报告有什么格式呢? 长城炮越野版将于4月上市,全系标配三把锁+涉水喉... 论文开题报告指导教师审核意见怎么写 三把锁的长城炮越野能力已登峰造极?这几款越野皮... 导师审核及推荐意见怎么写 长城炮越野版哪款值得买?全系四驱配三把锁!配置... 见习表格里教案部分后的指导教师审批意见怎么写 长城炮越野版上市,全系三把锁!顶配不到20万让皮... 长沙的一本大学有哪些 前后端分离,用伪静态还有意义吗 长城炮越野版4月上市 配三把锁+7种驾驶模式/越野能... 广安到稻城亚丁有好远,自驾要开好久 怎么直接跳出foreach循环 2016国庆广安到稻城亚丁自驾游有一同去的吗?找几个... 四川广安的,想去稻城县旅游,没有车,想知道乘车... asp.net如何跳出foreach循环 广汉自驾车到稻城亚丁多少公里? jquery each 和for怎么跳出循环终止本次循环 百闻不如一试,越野场地试驾长城炮越野皮卡,真实... 广汉到稻城亚丁有多远? 7种地形模式的长城炮越野皮卡是否值得买?试驾一下... 亚丁稻城至芦古湖多少公里自驾怎样走呢 php 如何退出foreach 循环 4月或上市:长城炮越野版标配四驱、三把锁,还能坦... foreach嵌套循环怎么跳出 岳池到亚丁稻城自驾游攻略 标配三把锁、坦克掉头,预计4月上市,长城炮越野皮... 桓台做网页设计 都说四驱车有三把锁,那这三把锁指的都是什么?