【问题标题】:How does one break out of a forEach loop? [duplicate]如何摆脱 forEach 循环? [复制]
【发布时间】:2013-06-11 20:32:14
【问题描述】:

如果你有:

var some = [0,1,2,3];
_.forEach(some, function (val) {
    if(val === 1) {
        // this return does nothing
        return;
    }
});

查看underscore source,您可以使用

突破forEach
var breaker = {};

但是,breaker 并未发布到公共范围,并且似乎是一个内部变量。

【问题讨论】:

  • 没有理由这样做。跳出循环if (iterator.call(context, obj[key], key, obj) === breaker) return;
  • 下划线会尽可能使用原生forEach,除非抛出异常(丑陋!),否则无法突破,使用some,检查相关stackoverflow.com/questions/2641347/…

标签: javascript underscore.js


【解决方案1】:

您可以使用 some 代替 forEach,这将在您第一次返回非 falsy 时停止它。 相反的是every(),当你返回虚假的东西时它会停止。

您仍然必须使用闭包传递数据,因为 .some() 将返回 true 或 false。

var some = [0,1,2,3];
_.some(some, function (val, index) {
    if(val === 1) {
        // this return does nothing
         alert("exiting at step "+index+" from finding "+val);
        return true;
    }

    alert("continuing at step "+index+" found "+val);
});

【讨论】:

  • 好的,我添加了另一个 tattletale,所以你可以看到它在行动......
  • @pure_code.mom some 可以中断,因为 undescore 的 breaker 对象在 some 的词法范围内可用,而 breaker 在范围内对于您的代码定义的任何函数(在下划线库之外)。
  • 这行得通。 some 让您在返回truthy 后立即退出函数,而forEach 则不会。
  • 从技术上讲,您根本不需要断路器……它只是检查返回值。我不确定它为什么会返回断路器或应用程序代码对您有什么好处。
  • if (result || (result = iterator.call(context, value, index, list))) return breaker;
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多