2012-09-04 136 views
43

可能重复:
How to short circuit Array.forEach like calling break?Break语句

有没有办法让我可以摆脱阵图的方法我的条件满足后?我尝试了下面的例子"Illegal Break Statement" Error.这是我想出的一个随机例子。

var myArray = [22,34,5,67,99,0]; 

var hasValueLessThanTen = false; 

myArray.map(function (value){ 
    if(value<10){ 
     hasValueLessThanTen = true; 
     break; 
    } 
    } 
); 

我们可以使用for循环,但我想知道我们是否可以用map方法完成相同的?

+4

它在本质上是罗布W为这个问题的副本。然而,这种误解的根源在于'map'方法的错误用法,它旨在嗯,映射值,所以它不应该停止迭代 – Yoni

+10

@Yoni是正确的。如果OP正在寻找一个易碎的forEach循环,可以考虑使用['[] .every'等方法](https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Array/every )(返回'true'继续,非'true'断行)或['[] .some'](https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Array /某些) - 返回true以中断,非true以继续。 –

+0

或者['[] .reduce'](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/reduce)。将'[]'作为第二个参数传递,并且只有在满足条件时才进行修改。 –

回答

60

这不可能使用内置的Array.prototype.map。但是,你可以使用一个简单的for -loop相反,如果你不打算map任何值:

var hasValueLessThanTen = false; 
for (var i = 0; i < myArray.length; i++) { 
    if (myArray[i] < 10) { 
    hasValueLessThanTen = true; 
    break; 
    } 
} 

或者,通过@RobW的建议,使用Array.prototype.some测试是否存在至少一个元素较少大于10时,一些你的函数匹配元素被发现将停止循环:

var hasValueLessThanTen = myArray.some(function (val) { 
    return val < 10; 
}); 
+2

尽管Rob已经提到过,但我还是很欣赏这个例子。人们并不总是看着评论,但通常至少扫描代码示例! – TheOneWhoPrograms

+3

为什么不可以用'Array.prototype.map'? – Vadorequest

+2

@Vadorequest当我是js新手时,我确实发布了这个问题,'Array.prototype.map'不应该用于那种方式,它是一个辅助方法,用于完全不同的用例,您希望将每个元素一个给定的数组放入不同的变体中。所以,当它涉及“每一个元素”时,如果你需要一个break语句,你永远不需要一个“break”语句,这意味着你可能不需要一张地图。 我发布了这个问题,因为我试图使用它作为'iterator',如果你需要迭代器,那么去简单的'for'循环或'forEach'连同'return' –