JavaScript数组map方法中的break语句

209

可能是重复问题:
如何像使用break一样短路Array.forEach方法?

有没有办法在满足条件后退出数组映射方法?我尝试了以下代码,但它会抛出"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方法实现相同的功能?

5
本质上,这是与 Rob W 提到的问题相同的重复问题。然而,导致这种误解的根源在于错误使用了 map 方法,该方法旨在将值映射到另一个值,因此不应停止迭代。 - Yoni
25
@Yoni是正确的。如果OP正在寻找可中断的forEach循环,请考虑使用诸如[].every(返回true以继续,非true以中断)或 [].some(返回true以中断,非true以继续)等方法。 - Rob W
另外一种方式是使用 [].reduce 方法,将 [] 作为第二个参数传入,并且只在满足条件时进行修改。 - Sandy Gifford
5
我不明白为什么这被标记为重复问题。链接的问题是关于forEach,而它有一个截然不同的解决方案。 - Sandy Gifford
1
@SandyGifford 同意。投票重新开放此问题。 - AndrewL64
显示剩余2条评论
1个回答

275

使用内置的Array.prototype.map是不可能实现的。但是,如果您不打算对任何值进行map操作,可以使用一个简单的for循环代替:

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;
});

7
尽管Rob已经提到过,但我很欣赏这个".some"示例。人们并不总是查看评论,但通常至少会扫描代码示例! - TheOneWhoPrograms
6
为什么不能使用Array.prototype.map实现这个? - Vadorequest
10
当我还是一个 JavaScript 新手时,我发布了这个问题。Array.prototype.map 不应该以这种方式使用,它是一个辅助方法,用于将给定数组的每个元素转换为不同的变量。所以,当涉及到“每个元素”时,您永远不需要“break”语句,如果需要“break”语句,则可能不需要使用 map。我发布这个问题是因为我试图将其用作 iterator,如果需要 iterator,则请使用简单的 for 循环或与 return 结合使用的 forEach - Mudassir Ali
2
似乎 forsome 更快:https://jsperf.com/array-some-vs-loop - cellepo
@MudassirAli,希望您能接受这个答案,对吧? - Sampath

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