无法打破for循环:不合语法的break

14

当某个条件满足时,我想要打破一个for循环

Translated text:

当某个条件满足时,我想要打破一个for循环

Object.keys(s).map(uk => {
    Object.keys(s[uk]).map(ik => {
        for (let i = 1; i < data.length; i++) {
            if (...) {
                s[uk][ik].map(elem => {
                    if (...) {
                        if (...) {
                            data.push(...);
                            break;
                            ...
然而,break语句给了我一个

Unsyntactic break

为什么呢?它只应该中断for循环,难道JavaScript认为我想要中断map吗?


2
那是因为break期望一个循环。你正在循环中调用一个函数。所以break无法检测到循环。 - Rajesh
1
可能是如何像调用中断一样短路Array.forEach?的重复问题。 - Rajesh
@Rajesh 我不想使用“for-Each”。我正在使用“for-loop”。 - four-eyes
为什么不使用 Array.some - Mirodil
@Stophface 复制的重点是如何突破一个函数。 - Rajesh
我必须补充说明,使用多个嵌套的if条件是一种非常糟糕的做法... - Borjovsky
3个回答

15
为了解决这个问题,你可以简单地使用 return; 代替 break;

13

正如你自己所建议的那样,你仍然在map部分。那实际上是一个箭头函数表达式,你不再在循环中了。把它想象成你在其他地方定义的某个函数,但这是一种更快的调用该函数的方式。

你没有按照javascript中map函数的意图使用它。它并不是用来方便地迭代数组的,而是从其他数组创建一个新数组。你应该改变你对map的使用,改为某种形式的循环


嗯...所以我需要将所有的maps改成for-loops吗? - four-eyes
1
是的,我在我的答案中也加了这个,但是map函数并不适用于迭代。它实际上返回一个新的数组,除此之外不应该用于其他任何目的。 - Neuron
如果我将map包含在for-loop内部,它会起作用吗? - four-eyes
1
你正在对症治疗,而不是解决问题。map函数并不适用于循环遍历数据。不要这样使用它!如果你没有将map的结果存储在变量中,那么你并没有正确地使用它。 - Neuron
嗯,如果我让map的结果在void中消失,这应该不会有太大的影响,我猜?! - four-eyes
有两个原因你不应该那样做。首先:坦率地说,这会在硬件上更加昂贵,因为你创建了一个箭头函数表达式,并且在后台创建了一些数组以准备返回。其次:这不是最佳实践。在编程中,通常有许多方法可以实现你的目标,但是你在职业生涯中编写的代码将由其他人查看和维护。使用“正确”的方式将使他们更容易立即理解你的意图并更快地理解你的代码。 - Neuron

11

在像 mapreduceforEach 等方法中,您无法使用 break。但是,在操作数据之前您可以使用 .filter 进行筛选,或者只需使用 .find 查找所需元素。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接