首页 > 其他分享 >js 跳出多层循环(终止循环)

js 跳出多层循环(终止循环)

时间:2023-12-12 23:22:24浏览次数:27  
标签:arr name 多层 js person fruit let 循环

1、throw new Error()

优点:可以中断循环执行;适用于各种形式(for循环,forEach循环等)
缺点:相当于强制抛错中断执行,不仅终止了循环,后续代码也不再执行

废话不多说,上例子,找出 【第一个爱吃芒果】 的人:

const arr = [
    {
        name: '张三',
        fruit: ['苹果', '香蕉']
    },
    {
        name: '李四',
        fruit: ['梨', '芒果']
    },
    {
        name: '王五',
        fruit: ['樱桃', '西瓜']
    },
    {
        name: '小红',
        fruit: ['菠萝', '芒果']
    },
]


let person = undefined

for (let i = 0; i < arr.length; i++) {

    for (let j = 0; j < arr[i].fruit.length; j++) {
    
        if (arr[i].fruit[j] === '芒果') {
        
            console.log(arr[i].name, arr[i].fruit[j])
            
            person = arr[i].name
            
            // 在这里抛出异常
            throw new Error('中断')
        }
    }
}
console.log('这里仍然可以执行', person)

 

看打印的结果:在找到第一个芒果之后,就抛出错,没有执行后续循环以及代码

【总结】

适用于验证拦截的情况,即没有后续代码。适用于各种循环形式
(但是抛个异常还是觉得怪怪的,不够完美啊)

2、为循环命名,跳出对应的循环

优点:多层循环时非常灵敏(想跳出哪一层,就跳出哪一层);循环体后面的代码仍然执行
缺点:必须是for循环!

上同样的例子:

const arr = [
    {
        name: '张三',
        fruit: ['苹果', '香蕉']
    },
    {
        name: '李四',
        fruit: ['梨', '芒果']
    },
    {
        name: '王五',
        fruit: ['樱桃', '西瓜']
    },
    {
        name: '小红',
        fruit: ['菠萝', '芒果']
    },
]


let person = undefined

// 为紧邻的for循环命名
testLoop:
for (let i = 0; i < arr.length; i++) {

    for (let j = 0; j < arr[i].fruit.length; j++) {
    
        console.log(arr[i].name, arr[i].fruit[j])
        
        if (arr[i].fruit[j] === '芒果') {
        
            person = arr[i].name
            
            // 跳出命名的循环
            break testLoop
        }
    }
}
console.log('这里仍然可以执行', person)

 

看打印的结果,不仅阻断了命名循环的执行,而且执行命名循环后续的代码!这就很妙了~

【总结】

1、因为后续代码仍然执行,所以可用于多种逻辑情况
(比如循环次数非常非常多,你想优化执行速度,只要拿到想到的结果之后,立刻终止循环)
2、灵活,非常灵活,跳出指定命名的循环;
3、所以就只好不辞辛苦地写for循环了,不过我认为值得

【番外篇】

我在想,是只需要变量紧邻的循环用for就可以了,还是每层都得用for循环呢??

机智(偷懒)的我,还是验证了一下,把第二层换成forEach

果不其然,现实给了我沉重的一击!

let person = undefined

testLoop2:
for (let i = 0; i < arr.length; i++) {
    arr[i].fruit.forEach(item => {
       if (item === '芒果') {
            person = arr[i].name
            break testLoop2
       }
    })
}
console.log('这里仍然可以执行', person)

 


o(╥﹏╥)o

老老实实写for吧~

标签:arr,name,多层,js,person,fruit,let,循环
From: https://www.cnblogs.com/Im-Victor/p/17898102.html

相关文章

  • [JavaScript] JS中如何跳出循环/结束遍历
    [JavaScript]JS中如何跳出循环/结束遍历直接抛结论,下表是JS中常用的实现循环遍历的方法的跳出/结束遍历的办法,经过测试后的总结。可能各位大佬还有其他的办法,我在此表示大佬NB。 序号方法breakcontinuereturnreturntruereturnfalse结论1for循环成功跳出本次循......
  • 几种简单的排序算法(js实现)
    排序是日常开发中经常用到的代码,下面是几种常见的排序算法:冒泡排序(BubbleSort)functionbubbleSort(arr){letlen=arr.length;for(leti=0;i<len-1;i++){for(letj=0;j<len-1-i;j++){if(arr[j]>arr[j+1]){......
  • js29
    1、使用requests的get()函数访问必应网站20次,打印返回状态,text()内容,计算text属性和content属性所返回网页内容的长度。代码如下:importrequestsforiinrange(20):r=requests.get('https://cn.bing.com',verify=False)r.encoding="utf-8"print(r.status_code)......
  • Java登陆第二十三天——JavaScript对象、JSON、事件
    JS中声明对象的两种格式方法1,newobject()然后依次添加属性或方法栗子:<script>//初始化对象varuser=newObject();//给对象添加属性并赋值user.name="张三";user.age=18;//给对象添加方法user.say=functi......
  • vscode settings.json
    {"workbench.startupEditor":"none","workbench.iconTheme":"vscode-icons","workbench.colorTheme":"Dracula","window.title":"${rootName}${separator}${profileName}",......
  • 面试官问我,try catch 应该在for循环里面还是外面?
    trycatch的位置是要根据具体情况来确定的。咱们先来说说for循环里面放trycatch的情况。当你的程序在for循环中可能会发生异常,但是这个异常并不是致命的,也不会影响整个循环的执行,那你就可以把trycatch放在for循环里面。举个例子吧,假设咱们要读取一个文件里的数据,然后进行处理。可......
  • json to dart插件的使用
    先说一种andriodstudio中的一个插件,就叫jsonto dart,你把json文件粘贴过去,然后他可以直接生成dart对象文件,但是通常需要自定义一些配置,否则代码很难读。下面是命令的形式在Flutter开发中,你可以使用一些插件来将JSON转换为Dart类。其中一个常用的插件是dart:convert包提供的......
  • Python——第五章:json模块
    什么是json:json模块是用于处理JSON(JavaScriptObjectNotation)数据的模块,翻译过来叫js对象简谱。JSON是一种轻量级的数据交换格式,常用于将数据在不同语言之间进行传递。我们先来看一段json代码:wf={"name":"汪峰","age":18,"hobby":"上头条","wife"......
  • nodejs的http.request最大响应体
    nodejs的http.request躺坑记录1、http.request之response.on("data",(chunk:Buffer)=>{})的chunk大小​ 由于nodejs的response.on("data")每次从服务端读取的chunk大小最大是65535Byte,并且查很多网站都找不大这个说明点所以狠狠踩了这个坑。这个65535有什么影响呢。本来编写的......
  • JSSDK获取signature签名,史上最全,没有之一
    微信公众号JSSDK获取signature签名,史上最全,没有之一1.操作流程1、通过appId和appSecret获取access_token;2、使用access_token获取jsapi_ticket;3、用时间戳、随机数、jsapi_ticket和要访问的url按照签名算法拼接字符串;4、对第三步得到的字符串进行SHA1加密,得到签名。2.上代码获取a......