2017-09-29 98 views
-1

注:我想用forEach回调函数打破while()循环,不打破forEach本身。在while循环中打破array.forEach?

我目前正在试图打破在foreach方法while循环中同样while循环,但JavaScript不喜欢里面的功能break语句。它吐出unsynctatic breakillegal break statement取决于环境。

我试图做这样的事情:

while(true) { 
    example = [false, false, true]; 
    example.forEach(function breakWhile(element) { 
     if(element) {break;} 
    }) 
} 

我知道,for...of(加上使用的while环标签)解决了这个,但它真的是我唯一的出路?我很喜欢使用array.forEach。更糟糕的是,我可能想使用一个函数,而这个函数也被JS引擎忽略了。

+3

的可能的复制[如何短路Array.forEach就像说破?](https://stackoverflow.com/questions/2641347/how-to-short-circuit-array -foreach样叫破) –

+0

@VoidRay不是真的,我想打破while()循环,而不是在foreach。 – Rafael

+0

有['every'](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/every)和['some'](HTTPS://显影剂。 mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/some),你应该在这里使用,连同其他几个['Array'](https://developer.mozilla.org/en- US/docs/Web/JavaScript/Reference/Global_Objects/Array#Methods_2)方法。 – Xufox

回答

0

我觉得你最好的选择就是使用的标志。

let dobreak = false; 
 
while(!dobreak) { 
 
    example = [false, false, true, false]; 
 
    example.forEach(function breakWhile(element) { 
 
     if(element) {dobreak = true;} 
 
     else if(!dobreak) { 
 
      console.log(element); 
 
     } 
 
    }) 
 
}

另一个想法是创建一个函数来替换内置的forEach,在这里,我把它叫做breakForEach如果迭代回调会打破在foreach内返回true,也会返回true,所以你可以打破这个时间。

你甚至可以将其添加到默认Array.prototype,但它是不可取的。

function breakForEach(arr, iter) { 
 
    for(let l = 0; l < arr.length; l ++) { 
 
    if (iter(arr[l])) return true;  
 
    } 
 
    return false; 
 
} 
 

 
while(true) { 
 
    var example = [false, false, true, false]; 
 
    if (breakForEach(example, function breakWhile(element) { 
 
     if(element) return true; 
 
     console.log(element); 
 
    })) break; 
 
}

+0

嗯。这不完全是我所希望的(“打破”更清晰),但这确实是一个解决方案。在接受这个之前,会稍微等待一些可能的更好的解决方案,但至少要提供一个解决方案+1。 ;) – Rafael

+0

这是你经常得到的模式吗?如果是这样,你可以创建一个辅助函数。也许称为'whileForEachBreak'或类似的东西。 – Keith

+0

其实这是我第一次这样做。 一个辅助函数也不会那么干净,不仅仅是用forEach打破,但这似乎不是一种可能性。 – Rafael