V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
feeeff
V2EX  ›  问与答

JavaScript 中,使用 「抛出错误的方式」停止 forEach 遍历可行吗?会造成什么隐藏问题?

  •  
  •   feeeff · 2023-06-20 11:57:40 +08:00 · 1041 次点击
    这是一个创建于 558 天前的主题,其中的信息可能已经有所发展或是发生改变。

    假设我有如下代码

    [1,2,3].forEach((number)=>{
    	console.log(number)
    })
    

    我的需求是当遍历到 number === 2 的时候,停止 forEach 遍历,按正常逻辑,应该将 forEach 替换为 for 循环,然后在 for 循环中执行 break 操作,但是也可以在 forEach 中,通过 throw new Error() 的方式,终止遍历,如下代码所示

    [1,2,3].forEach((number)=>{
    	if(number === 2){
        	throw new Error()
        }
    	console.log(number)
    })
    

    想问下大家,通过「抛出错误的方式」停止 forEach 遍历,是否可行呢?

    12 条回复    2023-06-20 14:30:04 +08:00
    molvqingtai
        1
    molvqingtai  
       2023-06-20 12:29:14 +08:00 via Android
    如果你需要校验入参抛出错误,没问题
    如果你只是想找到某个值停止循环,不建议使用这种方式
    ayase252
        2
    ayase252  
       2023-06-20 12:30:38 +08:00 via iPhone
    找第一个用 find ,forEach 不是用来查找的
    ZLY201
        3
    ZLY201  
       2023-06-20 12:39:25 +08:00
    Array.prototype.some
    Array.prototype.every
    应该能满足需求
    sweetcola
        4
    sweetcola  
       2023-06-20 12:44:58 +08:00
    抛出错误会导致 forEach 下面的代码也无法执行,而且还要处理报错,十分不建议。

    不想用 for 的话就对数组进行预处理

    ```
    arr.slice(0, arr.findIndex(v => v === 2) + 1).forEach
    ```
    wubalabadub
        5
    wubalabadub  
       2023-06-20 12:47:49 +08:00
    你也不想打开 console 里面一堆红叉叉吧
    taotaodaddy
        6
    taotaodaddy  
       2023-06-20 12:48:15 +08:00
    这就是能用而不好的方式
    ChefIsAwesome
        7
    ChefIsAwesome  
       2023-06-20 12:53:54 +08:00   ❤️ 1
    我接手过更有意思的代码,拿 map 当 find 用。你说它不能用吧,它也确实达到效果了。
    let result
    someArray.map(i => {
    if (...) result = i
    })
    qingshui33
        8
    qingshui33  
       2023-06-20 13:07:29 +08:00
    所以怎么终止 forEach 循环呢
    crysislinux
        9
    crysislinux  
       2023-06-20 13:09:18 +08:00 via Android
    这就是该用传统 for 的时候了
    Ritr
        10
    Ritr  
       2023-06-20 14:24:25 +08:00
    @qingshui33 用 return 结束掉整个 function
    Ritr
        11
    Ritr  
       2023-06-20 14:25:37 +08:00
    forEach 是迭代,不断的去 next next next ,不适合这种情况,使用 some 或者 find ,使用 for 也可
    kdwnil
        12
    kdwnil  
       2023-06-20 14:30:04 +08:00 via Android
    想起之前用 filter(()=>...)[0] 来找第一个。。。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2415 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 29ms · UTC 15:43 · PVG 23:43 · LAX 07:43 · JFK 10:43
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.