【问题标题】:Break or continue loop within function calls在函数调用中中断或继续循环
【发布时间】:2016-11-17 06:12:26
【问题描述】:

我的问题是:如何通过被调用的函数触发break;continue; 循环?问题是,我不想将所有可能的条件嵌套在一个循环中以避免代码复杂性。我在想一些伪例子:

var someObjects = [...] //array with some js objects    

for (var i = 0; i < someObjects.length; i++) {
  var element = someObjects[i];
  doSomething(element);
}

function doSomething(object) {
  //some code here
  if (somethingIsDefined) {
    doSomethingElse(object);
  }
}

function doSomethingElse(anotherObject) {
  //some more code here
  if (somethingMatches) {
    //here i would like to break the most upper loop
  }
}

//someObjects will be processed

我知道可以引入例如一个布尔变量并在循环中检查它是真还是假,并取决于它,break;continue;
但这 - 即使它只是一行 - 会增加嵌套。您看到任何可能的解决方案吗?

【问题讨论】:

  • 您可以将全局布尔值设置为 false,在您的函数中将其设置为 true,并检查每次迭代是否布尔值为 true。
  • 您可以尝试将迭代器移出for循环,当somethingMatches时,将其设置为someObjects.length,以便它移出循环..(只是一个想法,从来没有这样做过)
  • @AppleCrazy 没错,但正如我提到的那样,这会增加 for 循环中的嵌套。我知道我可以这样做,但我想问是否有办法避免嵌套。
  • @gkb 哦,很好的观察。我没有考虑到这一点。这实际上可以解决它。除此之外,如果函数不在同一个上下文或命名空间中,我必须将它作为参数传递。
  • 是的,它需要是一个全局变量,但必须在该命名空间或上下文中..以避免将其作为参数发送..

标签: javascript performance code-complexity


【解决方案1】:

如果您使用我推荐的Underscore library,您可以编写以下内容:

_.any(someObjects, doSomething);

function doSomething(object) {
  //some code here
  return somethingIsDefined &&
    doSomethingElse(object);
}

function doSomethingElse(anotherObject) {
  //some more code here
  return  somethingMatches;
}

【讨论】:

    猜你喜欢
    • 2020-06-09
    • 1970-01-01
    • 2014-06-10
    • 2010-09-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多