【问题标题】:Break statement in javascript array map method [duplicate]javascript数组映射方法中的中断语句[重复]
【发布时间】:2012-08-28 22:31:46
【问题描述】:

可能重复:
How to short circuit Array.forEach like calling 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 方法完成相同的操作?

【问题讨论】:

  • 它本质上是 Rob W 所指问题的重复。然而,这种误解的根源在于map方法的错误使用,它的目的是,嗯,映射值,所以它不应该停止迭代
  • @Yoni 是正确的。如果 OP 正在寻找一个可破坏的 forEach 循环,请考虑使用诸如[].every (返回true 继续,非true 以中断)或[].some - 返回true 以中断,非true 以继续.
  • 或者[].reduce。将[] 作为第二个参数传递,并且仅在满足条件时进行修改。
  • 我也不明白为什么这被标记为重复。链接的问题是关于forEach,它有一个非常不同的解决方案。
  • /(这可能是一个黑客)var myArray = [22, 34, 5, 67, 99, 0]; var BreakExc = {} var hasValueLessThanTen = false; try { myArray.map(function (value) { if (value &lt; 10) { hasValueLessThanTen = true; throw BreakExc; } } ); } catch (e) { // this part can be simplified. its to make it readable if (e !== BreakException) { console.log(e) throw e; } else { // Do nothing. console.log(e) } }

标签: javascript


【解决方案1】:

使用内置的Array.prototype.map 是不可能的。但是,如果您不打算 map 任何值,则可以使用简单的 for-loop:

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

【讨论】:

  • 我很欣赏这个 .some 例子,尽管 Rob 已经提到过它。人们并不总是查看 cmets,但通常至少扫描代码示例!
  • 为什么不能使用Array.prototype.map
  • @Vadorequest 当我还是 js 新手时,我确实发布了这个问题,Array.prototype.map 根本不应该这样使用,它是一个帮助方法,用于您想要转换的完全不同的用例给定数组的每个元素转换为不同的变体。所以,当它涉及“每个元素”时,你永远不需要“break”语句,如果你需要一个 break 语句,这意味着你可能不需要地图。我发布了这个问题,因为我试图将其用作iterator,如果您需要迭代器,请使用简单的for 循环或forEachreturn
  • 看来forsome快:jsperf.com/array-some-vs-loop
  • @MudassirAli 我希望你能接受这个答案吗?
猜你喜欢
  • 1970-01-01
  • 2021-08-07
  • 2019-12-14
  • 2020-10-14
  • 2011-08-04
  • 2014-03-11
  • 2012-04-01
  • 1970-01-01
相关资源
最近更新 更多