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

2023-06-20 11:57:40 +08:00
 feeeff

假设我有如下代码

[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 遍历,是否可行呢?

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

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

```
arr.slice(0, arr.findIndex(v => v === 2) + 1).forEach
```
wubalabadub
2023-06-20 12:47:49 +08:00
你也不想打开 console 里面一堆红叉叉吧
taotaodaddy
2023-06-20 12:48:15 +08:00
这就是能用而不好的方式
ChefIsAwesome
2023-06-20 12:53:54 +08:00
我接手过更有意思的代码,拿 map 当 find 用。你说它不能用吧,它也确实达到效果了。
let result
someArray.map(i => {
if (...) result = i
})
qingshui33
2023-06-20 13:07:29 +08:00
所以怎么终止 forEach 循环呢
crysislinux
2023-06-20 13:09:18 +08:00
这就是该用传统 for 的时候了
Ritr
2023-06-20 14:24:25 +08:00
@qingshui33 用 return 结束掉整个 function
Ritr
2023-06-20 14:25:37 +08:00
forEach 是迭代,不断的去 next next next ,不适合这种情况,使用 some 或者 find ,使用 for 也可
kdwnil
2023-06-20 14:30:04 +08:00
想起之前用 filter(()=>...)[0] 来找第一个。。。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/950270

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX