JavaScript 中断 forEach 循环

1、使用 Array.prototype.some() 方法代替

some() 方法会在找到第一个符合条件的元素时停止循环。

例如:

let array = [1, 2, 3, 4, 5];
array.some(function(element, index, array) {
    if (element === 3) {
        console.log("Found 3 at index " + index);
        return true;
    }
});

上述代码会在找到第一个符合条件的元素(即 3)时停止循环。

2、使用 Array.prototype.every() 方法代替

let array = [1, 2, 3, 4, 5];
let stop = array.every(function(element) {
    console.log(element);
    if (element === 3) {
        console.log("Found 3 at index ");
        return false;
    }
    return true;
});

上述代码会在找到第一个符合条件的元素(即 3)时停止循环。

请注意,该方法找到的元素不会返回,需要在回调中自己处理。

3、使用 for循环代替

let array = [1, 2, 3, 4, 5];
for(let i = 0; i < array.length; i++) {
    if (array[i] === 3) {
        console.log("Found 3 at index " + i);
        break;
    }
}

上述代码也会在找到第一个符合条件的元素(即 3)时停止循环。

4、使用 try-catch 结构

可以在 forEach 循环内部使用 throw 语句来中断循环,并在外部使用 catch 语句来捕获该异常。

例如:

let array = [1, 2, 3, 4, 5];
try {
    array.forEach(function(element, index, array) {
        if (element === 3) {
            console.log("Found 3 at index " + index);
            throw "StopIteration";
        }
    });
} catch (e) {
    if (e !== "StopIteration") throw e;
}

上述代码会在找到第一个符合条件的元素(即 3)时停止循环。

请注意,使用 throw 语句中断 forEach 循环可能会使代码变得更加复杂,并且容易出现错误。因此,如果可能的话,应该使用前面提到的 Array.prototype.some() 或 for 循环来代替。

5、使用自定义的迭代器函数

let array = [1, 2, 3, 4, 5];

function forEach(array, callback) {
    for (let i = 0; i < array.length; i++) {
        callback(array[i], i, array);
        if (array[i] === 3) {
            console.log("Found 3 at index " + i);
            break;
        }
    }
}

forEach(array, function(element, index, array) {
    console.log(element);
});

上述代码会在找到第一个符合条件的元素(即 3)时停止循环。

这种方法虽然不够简洁,但是它可以在不改变原来的forEach函数的情况下,增加新的功能。

6、使用 Array.prototype.find() 或 Array.prototype.findIndex() 方法代替

find() 方法会在找到符合条件的第一个元素后返回该元素,并停止循环。

例如:

let array = [1, 2, 3, 4, 5];
let found = array.find(function(element) {
    return element === 3;
});
console.log(found);

上述代码会在找到第一个符合条件的元素(即 3)时停止循环并返回该元素。

Array.prototype.findIndex() 方法会在找到符合条件的第一个元素后返回该元素的索引,并停止循环。

例如:

let array = [1, 2, 3, 4, 5];
let index = array.findIndex(function(element) {
    return element === 3;
});
console.log(index);

上述代码会在找到第一个符合条件的元素(即 3)时停止循环并返回该元素的索引。

使用 Array.prototype.find() 或 Array.prototype.findIndex() 方法可以在 forEach 循环中找到符合条件的第一个元素并停止循环。这两种方法是在找到符合条件的元素后返回该元素或索引,而不是像 some() 方法或 for 循环中需要再次返回一个布尔值或使用 throw 语句来中断循环。

 

总之,主要方法还是通过其它方式代替 forEach 循环的中断,只有方法4 使用 try-catch 结构是实际意义上中断 forEach 循环。

作者:yuzhihui
出处:http://www.cnblogs.com/yuzhihui/ 声明:欢迎任何形式的转载,但请务必注明出处!!!
本文转载于网络 如有侵权请联系删除

相关文章

  • 涨姿势 , JavaScript 玩转多线程编程~

    点击上方“IT平头哥联盟”,选择“置顶或者星标” 与你一起成长~作者:chunpengliu浏览器端JavaScript是以单线程的方式执行的,也就是说JavaScript和UI渲染占用同一个主线程,那就意味着,如果JavaScript进行高负载的数据处理,UI渲染就很有可能被阻断,浏览器就会出现卡顿,降低了用户体验。为此,JavaScript提供了异步操作,比如定时器(setTimeout、setInterval)事件、Ajax请求、I/O回调等。我们可以把高负载的任务使用异步处理,它们将会被放入浏览器的事件任务队列(eventloop)中去,等到JavaScript运行时执行线程空闲时候,事件队列才会按照先进先出的原则被一一执行。通过类似定时器,回调函数等异步编程方式在平常的工作中已经足够,但是如果做复杂运算,这种方式的不足就逐渐体现出来,比如settimeout拿到的值并不正确,或者页面有复杂运算的时候很容易触发假死状态,异步代码会影响主线程的代码执行,异步终究还是单线程,不能从根本上解决问题。多线程(WebWorker)就应运而生,它是HTML5标准的一部分,这一规范定义了一套

  • 你所认为公平的游戏真的公平么? | MixLab人工智能

    摘自论文:DonaldDuckHolidayGame:AnumericalanalysisofaGameoftheGooserole-playingvarianthttp://arxiv.org/pdf/2001.04513v1-提炼这是一款桌游,游戏的目标是成为第一个到达位于最后一个广场上的露营地的玩家,但这是一条充满无数障碍,挑战和经验的道路。在到达终点,享受露营之前必须忍受这些障碍,挑战和经验。作者创建2至5个玩家的场景,针对所测试的每个场景重复进行10,000次游戏试验。该论文用蒙特卡洛的方法模拟游戏,帮助游戏设计师分析游戏的关键属性。这种方法可以帮助游戏设计师设计更好的游戏平衡性。-结论摘取其中的2个发现:有些角色比其他角色更有可能获胜;大多数玩家在某个时候领先,但是在比赛结束时领先是确保获胜的重要因素。如下图所示,可以看到每个角色的获胜次数:高飞和唐纳德的获胜概率大大超过了竞争对手。"当样本足够多时,那些隐含的“规律”就可得到有效的挖掘。"-本文结束-

  • Python中的命名空间、作用域以及lo

         最近一直看一本python经典教材——《Python学习手册》,因为之前都是突击学的,也没有仔细看一些经典教材,所以感觉自己的基础掌握的还不是很好,虽然网络上资源多,但我觉得还是有必要买本教材来认真的读一读,底层基础决定上层建筑嘛,基础打牢一些,对今后的编程还是会有些帮助的。    今天来谈谈python中的命名空间和作用域相关的概念(其实很多面向对象程序语言都有这个概念,我记得自己当初自学C++时就接触过这两个概念),希望对有需要的朋友有帮助,当然我更希望你能找本教材来看看。      命名空间是一个保存变量名的地方,当在程序中使用变量名时,python创建、改变或者查找都是在所谓的命名空间中进行的。当我们谈论到搜索变量名对应于代码的值的时候,作用域这个术语指的就是命名空间,也就是说在代码中,变量名被赋值的位置决定了这个变量名能被访问到的访问       python的变量名在第一次赋值时就已经创建,并且必须经过赋值后才能使用,python会将一个变量名被赋值的地点关联为一个特点的命名空间(也就是说命名空间就是名字到实际python对象的一个映射,命名空间是一个字典(dic

  • 【项目实战】自监控-08-DataFrame行列操作(下篇)

    系统:Windows7 语言版本:Anaconda3-4.3.0.1-Windows-x86_64 编辑器:pycharm-community-2016.3.2这个系列主要是实际在做项目的一个笔记自监控项目,主要是对采集的质量监控数据做的一个实时预警今天继续讲讲如何从DataFrame获取需要到的行或者列主要涉及:ix,at,iat,get_value今日歌曲:Part1:构建一个DataFrame一个DataFrame可以看成一个二维表格,不过这个二维表格有行标题也有列标题,而且每类标题可能不止一级示例中由一个字典构建一个DataFrame通过index参数制定行名称importpandasaspddict1={"a":[1,3,5,6],"b":[11,12,15,16], "c":[22,27,29,30],"d":[82,87,89,80]}df=pd.DataFrame(dict1,index=["x","y","z","q&q

  • C#调用GDI+1.1中的函数实现高斯模糊、USM锐化等经典效果。

    在GDI+1.1的版本中,MS加入不少新的特性,其中的特效类Effect就是一个很有吸引力的东西,可惜在VS2010的Image类中,却没有把这个类封装进来(不晓得是不是我没有发现),这个也许MS也有自己的考虑的,毕竟要使用这些函数,必须要求系统是WindowsVista及其以上,而XP的市场占有率在那个时候还比较高的。 不过,作为一种选择,我们有义务把这些函数给哪些已经按照了这些最新系统的客户使用。 其实,这些函数我在VB6下两年前就已经调用过,调用的方式也很简单明了,现在,在学习C#,就要考虑如何将他们封装入C#中。虽然哪些算法的更底层(像素级别的处理实现)实现在很早之前就已经实现,但是能够直接调用现有的函数对于不少朋友来说还是一件很幸福的事情的。 实现这个功能的第一步就是要找到这些函数的声明,这个在MSDN上有C风格的声明,改成C#语言的大部分都不成问题,参考http://msdn.microsoft.com/en-us/library/ms533971(VS.85).aspx 例如,这个  GpStatusWINGDIPAPIGdipBitmapApplyEffect(G

  • 十分钟完成Bash 脚本进阶!列举Bash经典用法及其案例

    前言:在linux中,Bash脚本是很基础的知识,大家可能一听脚本感觉很高大上,像小编当初刚开始学一样,感觉会写脚本的都是大神。虽然复杂的脚本是很烧脑,但是,当我们熟练的掌握了其中的用法与技巧,再多加练习,总有一天也会成为得心应手的脚本大神。脚本在生产中的作用,想必小编我不说,大家也都知道,脚本写的6,可以省下很多复杂的操作,减轻自己的工作压力。好了,废话不多说,接下来,就是Bash脚本的用法展示。一、条件选择、判断(if·、case)二、四个循环(for、while、until、select)三、循环里的一些命令与技巧(continue、break、shift...)四、信号捕获trap一、条件选择、判断(1)条件选择if1、用法格式if判断条件1;then  条件为真的分支代码elif判断条件2;then  条件为真的分支代码elif判断条件3;then  条件为真的分支代码else  以上条件都为假的分支代码fi逐条件进行判断,第一次遇为“真”条件时,执行其分支,而后结束整个if。2、经典案例:①判断年纪分析:请输入年纪,先判断输入的是否含有除数字以外的字符,有,就报错;没有,继

  • Docker快速入门(一)

    Docker是Go语言开发实现的容器。2013年发布至今,备受推崇。相关文档、学习资料十分详尽。近期公司docker项目要推进,得重新学习一下。博客以笔记。1容器诞生背景及优势(1)软件开发和运维中,环境部署、配置,不胜其烦。举例说明,Python开发和部署都必须配置Python解释器;运维过程中,有时测试环境能通过,但是到线上却报错,究其原因,是环境不一致。 传统运维过程中,线上有十台机器,每增加一台都需要重新部署一次,简直就是“体力劳动”。 (2)虚拟机在一定程度可以解决这些问题,但是存在几个缺点: -资源占用多虚机启动需要占用几百M的内存。 -冗余步骤多系统级别的操作步骤,往往无法跳过,比如用户登录。 -启动慢,往往几分钟启动操作系统需要多久,启动虚拟机就需要多久。(3)容器优势 容器不是模拟一个操作系统,而是对进程进行隔离。属于进程级别。 -启动快,相当于启动本机底层系统的一个进程,而不是虚拟机内部的进程,速度快很多。 -占用资源少,容器只占用需要的资源,不占用那些没有用到的资源;多个容器可以共享资源,虚拟机是独享资源。 -体积小,容器只要包含用到的组件即可,而虚

  • VR Health Institute开发出VR运动评级系统,带你燃烧卡路里

    VRHealthInstitute(VR健康研究所)开发了一个名为“VRExerciseRating”的评级系统,该系统能将玩VR游戏所消耗的卡路里同常规运动项目(如步行,跑步和游泳)进行比较。毋容置疑的是,空间定位下的VR体验是可以燃烧卡路里的。但玩VR游戏这一过程究竟会燃烧多少卡路里,其数值让人不得而知。近期,VR健康研究所与旧金山州立大学运动学系合作,测试了40名志愿者在玩不同游戏时的氧气消耗量,以判断一名普通人在一分钟的游戏中内燃烧的卡路里数。最终的测试结果令人非常惊讶。旧金山州立大学运动学系主任兼VR研究员MarialiceKern博士说道,“测试结果显示,许多VR游戏的卡路里消耗数都等同于剧烈运动所燃烧的卡路里数。与此同时,我们观察到参与者们往往并没有感觉到他们使了很大的力。在不会意识到任何痛苦的情况下,他们却在消耗着能量。”Kern博士的发现非常有趣,他认为VR游戏可以燃烧卡路里这一事实,会让玩家们比以前更加健康。因为电脑游戏作为一种传统的久坐不动的活动,许多人每天都要花费好几个小时去玩他们最爱的那一款游戏。早在2014年,Nielson市场调查机构在其发表的一篇报告中指

  • Python之匿名函数

    Python之匿名函数今天给大家介绍一下Python中的匿名函数。匿名函数由关键字来定义参数列表不需要小括号冒号不是开启新的语句块的只能写在一行上没有return语句,最后一个表达式的值就是返回值#一个简单的例子: In[1]:lambdax:x+1 Out[1]: #第一种用法 (lambdax:x+1)(3)#第一个括号用来改变优先级,第二对括号表示函数调用 In[2]:(lambdax:x+1)(3) Out[2]:4 #第二种用法,把匿名函数赋值给变量 f=lambdax:x+1 f(5) In[3]:f=lambdax:x+1 In[4]:f(5) Out[4]:6 lambdax,y:x+y #也可以这样调用 (lambdax,y:x+y)(3,5)#第一个括号是用来改变优先级的,第二个括号是调用函数的 add=lambdax,y:x+y add(3,5) #也可以设置默认参数: lambdax,y=1:x+y add=lambdax,y=1:x+y add(3) #调用的时候也可以用关键字参数 add(x=5) lambdax,y=1:x+y add=lambdax,y=

  • information leakage._information interview

    大家好,又见面了,我是你们的朋友全栈君。https://www.owasp.org/index.php/Information_LeakageExamplesExample1Thefollowingcodeprintsthepathenvironmentvariabletothestandarderrorstream: char*path=getenv("PATH"); ... sprintf(stderr,"cannotfindexeonpath%s\n",path);复制Example2Thefollowingcodeprintsanexceptiontothestandarderrorstream: try{ ... }catch(Exceptione){ e.printStackTrace(); }复制Dependinguponthesystemconfiguration,thisinformationcanbedumpedtoaconsole,writtentoalogfile,orexposedtoaremoteuse

  • 腾讯云媒体处理获取采样截图模板列表api接口

    1.接口描述接口请求域名:mps.tencentcloudapi.com。 查询采样截图模板,支持根据条件,分页查询。 默认接口请求频率限制:100次/秒。 APIExplorer提供了在线调用、签名验证、SDK代码生成和快速检索接口等能力。您可查看每次调用的请求内容和返回结果以及自动生成SDK调用示例。 2.输入参数以下请求参数列表仅列出了接口请求参数和部分公共参数,完整公共参数列表见公共请求参数。 参数名称 必选 类型 描述 Action 是 String 公共参数,本接口取值:DescribeSampleSnapshotTemplates。 Version 是 String 公共参数,本接口取值:2019-06-12。 Region 否 String 公共参数,本接口不需要传递此参数。 Definitions.N 否 ArrayofInteger 采样截图模板唯一标识过滤条件,数组长度限制:100。 Offset 否 Integer 分页偏移量,默认值:0。 Limit 否 Integer 返回记录条数,默认值:10,最大值:1

  • pyspark基础知识点

    1.查 1.1行元素查询操作  像SQL那样打印列表前20元素,show函数内可用int类型指定要打印的行数: df.show() df.show(30) 复制 以树的形式打印概要: df.printSchema() 复制 获取头几行到本地:  list=df.head(3)#Example:[Row(a=1,b=1),Row(a=2,b=2),......] list=df.take(5)#Example:[Row(a=1,b=1),Row(a=2,b=2),......] 复制 查询总行数:   df.count() 复制   取别名: df.select(df.age.alias('age_value'),'name')复制   查询某列为null的行: frompyspark.sql.functionsimportisnull df=df.filter(isnull("col_a")) 复制 输出list类型,list中每个元素是Row类: list=df.collect()#注:此方法将所有数据全部导入到本地,返回一个A

  • 数据结构 B-树和B+树的应用:数据搜索和数据库索引

    B-树   1.B-树定义 B-树是一种平衡的多路查找树,它在文件系统中很有用。 定义:一棵m阶的B-树,或者为空树,或为满足下列特性的m叉树:⑴树中每个结点至多有m棵子树;⑵若根结点不是叶子结点,则至少有两棵子树; ⑶除根结点之外的所有非终端结点至少有[m/2]棵子树;⑷所有的非终端结点中包含以下信息数据:       (n,A0,K1,A1,K2,…,Kn,An)其中:Ki(i=1,2,…,n)为关键码,且Ki<Ki+1,            Ai 为指向子树根结点的指针(i=0,1,…,n),且指针Ai-1所指子树中所有结点的关键码均小于Ki(i=1,2,…,n),An所指子树中所有结点的关键码均大于Kn.            n   为关键码的

  • POJ2155(二维树状数组)

    Matrix TimeLimit: 3000MS   MemoryLimit: 65536K TotalSubmissions: 17226   Accepted: 6461 Description GivenanN*NmatrixA,whoseelementsareeither0or1.A[i,j]meansthenumberinthei-throwandj-thcolumn.InitiallywehaveA[i,j]=0(1<=i,j<=N). Wecanchangethematrixinthefollowingway.Givenarectanglewhoseupper-leftcorneris(x1,y1)andlower-rightcorneris(x2,y2),wechangealltheelementsintherectanglebyusing"not"operation(ifitisa'0'thenchangeitinto'1'otherwisechangeitinto

  • poj3255Roadblocks

    Roadblocks 题意: 给你n个点和r个边,求次短路。 思路: 考虑一下次短路v的条件,第一种是到u的最短路+d(u,v),第二种是到u的次短路+d(u,v)。 因此,只需要维护一下最短路和次短路就可以了, #include<cstdio> #include<iostream> #include<algorithm> #include<cmath> #include<cstdlib> #include<cstring> #include<map> #include<stack> #include<queue> #include<vector> #include<bitset> #include<set> #include<utility> #defineinf0x3f3f3f3f #defineINF0x3f3f3f3f3f3f3f3f #definemem(a,b)memset(a,b,sizeof(a)) #definep

  • (联考)noip88

    T1 先%b0.5h就切 20pts:暴力dp。 100pts: 待填 T2 部分分很多,题目也不算难,然而我是sb。 10pts:瞎写。 10+20pts:\(k=2\)的直接枚举,距离就是二者树上的距离。 10+20+20pts:\(k=3\)的,手模一下,你就知道。 100pts: 对于选择的\(k\)个点,起点终点一定在这\(k\)个点之中废话。 先假设最终要求回到起点,那么最短路径便是遍历完这\(k\)个点的边数\(\times2\)。 不回到起点的话,可以找出这\(k\)个点能形成的最长的链,拿上边的一减就是经过\(k\)个点的最短路径。 于是可以指定\((u,v)\)之间的距离为最长的链,然后枚举点\(w\),判断其是否能加入当前以\((u,v)\)为最长链的集合,点\(w\)非法当且仅当: \(dis(u,w)<dis(u,v)\) \(dis(v,w)<dis(u,v)\) \(dis(u,w)=dis(u,v)\wedgew<v\) \(dis(v,w)=dis(u,v)\wedgew<u\) 要求字典序是为了防止重复计算

  • 我的书单

      特开此文记录我说读技术书单(闲书就不计入了), 一方面是鼓励和监督不断提升自我的过程;一方面是给大家做个参考~ 如果时间富裕也会写相关的读书笔记,加油!!     name:                 deadline:   《C陷阱与缺陷》            2017-09-23     《neural-networks-and   -deep-learning-zh_cn》        2017-10-06   《deeplearningtutorial》       2017-10-20   《鸟哥的linux私房菜》         2018-03-31   《UNIX环境高级编程》         2018-04-10   《廖雪峰的PYTHON教程》       2018-04-17   《大话设计模式》           2019-05-07   《automatetheboringstuffwithpython》    学学学~

  • 从人被造的目的看灵魂的价值2014-07-07 唐崇荣 祷告吧

    本章要从「人被造的目的」看灵魂的价值。人被造到底有目的或是无目的?如果有,那目的是什么?以人类的有限可不可能了解这目的?如果不可能的话,那我们活在世上岂不是和目的脱节了吗?这目的有何价值,就代表人有何价值,这个目的与价值的关系就变成相对的关系,换句话说:目的高,价值也高;目的低,价值也低。 神造人,是否因时间太多,能力太大,随便造造,当成玩的把戏,或是有固定的目的,永恒的价值,和永远的计划呢?如果有目的的话,我们就来思想究竟神造人的目的是什么?(读经:创世记一章26-27节,见章末参考经文。)我 们已了解,人不能凭自己的本性来了解人活着的目的,有关这个问题,是许多伦理哲学家所寻找的。几千年来,文明进步到这种地步,而人对自己为何活在这世界, 却还没有绝对的把握,这就是今天世代仍在混乱中的一个原因。目的与价值既有相对的关系,所以我们要先找到人活着的目的,以便了解灵魂的价值。我们发现一个人有了目的时,他就不会浪费他的力量和时光,就像一个人的金钱有固定的目的与价值时,他就不会随便花费一样。今天有多少青年人浪费他们的智力、精神、金钱、时间,去做那些不合于他们生活目的的事,因为他们还没有发现人的目

  • Java8 Stream

    概述 Stream是Java8中处理集合的关键抽象概念,它可以指定你希望对集合进行的操作,可以执行非常复杂的查找、过滤和映射数据等操作。使用StreamAPI对集合数据进行操作,就类似于使用SQL执行的数据库查询。也可以使用StreamAPI来并行执行操作。简而言之,StreamAPI提供了一种高效且易于使用的处理数据的方式。 Stream不是集合元素,它不是数据结构并不保存数据,它是有关算法和计算的,它更像一个高级版本的Iterator。原始版本的Iterator,用户只能显式地一个一个遍历元素并对其执行某些操作;高级版本的Stream,用户只要给出需要对其包含的元素执行什么操作,比如“过滤掉长度大于10的字符串”、“获取每个字符串的首字母”等,Stream会隐式地在内部进行遍历,做出相应的数据转换。 Stream就如同一个迭代器(Iterator),单向,不可往复,数据只能遍历一次,遍历过一次后即用尽了,就好比流水从面前流过,一去不复返。 而和迭代器又不同的是,Stream可以并行化操作,迭代器只能命令式地、串行化操作。顾名思义,当使用串行方式去遍历时,每个item读完后再读下一个

  • 7. python 函数

    函数def 函数return的注意点和函数文档 变量的作用域局部变量全局变量 #局部变量 deftestA(): a=100 print(a) testA() 复制 函数的返回值 deftest1(): #return1,2#默认返回的是元组 #return[10,20]#可以输出元组、列表、字典 return{'name':'Python','age':18} res=test1() print(res) 复制 函数参数 位置参数 #位置参数 deftest1(name,age,gender): print(f'你的名字{name},年龄{age},性别{gender}') test1('TOM',20,'男')#参数一一对应,传入的参数和形参个数不一致时,会报错 复制 关键字参数 #关键字参数 deftest1(name,age,gender): print(f'你的名字{name},年龄{age},性别{gender}') test1('ROSE',age=18,gender='男') #1.位置参数要放在关键字参数之前,否者会报错 #

  • 房价数据可视化

    本篇文章中的数据,全都自己模拟,如有雷同,纯属巧合 以下为可视化的效果图:

相关推荐

推荐阅读