V2EX = way to explore
V2EX 是一个关于分享和探索的地方
Sign Up Now
For Existing Member  Sign In
feeeff
V2EX  ›  问与答

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

  •  
  •   feeeff · Jun 20, 2023 · 1624 views
    This topic created in 1041 days ago, the information mentioned may be changed or developed.

    假设我有如下代码

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

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

    ```
    arr.slice(0, arr.findIndex(v => v === 2) + 1).forEach
    ```
    wubalabadub
        5
    wubalabadub  
       Jun 20, 2023
    你也不想打开 console 里面一堆红叉叉吧
    taotaodaddy
        6
    taotaodaddy  
       Jun 20, 2023
    这就是能用而不好的方式
    ChefIsAwesome
        7
    ChefIsAwesome  
       Jun 20, 2023   ❤️ 1
    我接手过更有意思的代码,拿 map 当 find 用。你说它不能用吧,它也确实达到效果了。
    let result
    someArray.map(i => {
    if (...) result = i
    })
    qingshui33
        8
    qingshui33  
       Jun 20, 2023
    所以怎么终止 forEach 循环呢
    crysislinux
        9
    crysislinux  
       Jun 20, 2023 via Android
    这就是该用传统 for 的时候了
    Ritr
        10
    Ritr  
       Jun 20, 2023
    @qingshui33 用 return 结束掉整个 function
    Ritr
        11
    Ritr  
       Jun 20, 2023
    forEach 是迭代,不断的去 next next next ,不适合这种情况,使用 some 或者 find ,使用 for 也可
    kdwnil
        12
    kdwnil  
       Jun 20, 2023 via Android
    想起之前用 filter(()=>...)[0] 来找第一个。。。
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   5654 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 62ms · UTC 01:36 · PVG 09:36 · LAX 18:36 · JFK 21:36
    ♥ Do have faith in what you're doing.