在Coffeescript中中断/继续嵌套循环

在Coffeescript中中断/继续嵌套循环,coffeescript,Coffeescript,如何在Coffeescript中中断/继续嵌套循环?例如,我有一些类似于: for cat in categories for job in jobs if condition do(this) ## Iterate to the next cat in the first loop 还有,有没有办法将整个第二个循环包装为第一个循环中另一个函数的条件?例如 for cat in categories if conditionTerm == job for

如何在Coffeescript中中断/继续嵌套循环?例如,我有一些类似于:

for cat in categories
  for job in jobs
    if condition
      do(this)
      ## Iterate to the next cat in the first loop
还有,有没有办法将整个第二个循环包装为第一个循环中另一个函数的条件?例如

for cat in categories
  if conditionTerm == job for job in jobs
    do(this)
    ## Iterate to the next cat in the first loop
  do(that) ## Execute upon eliminating all possibilities in the second for loop,
           ## but don't if the 'if conditionTerm' was met

break
的工作原理与js一样:

类别中的cat的

工作中的工作
如果条件
这样做
break##迭代到第一个循环中的下一个cat
你的第二个案例不是很清楚,但我想你想要这个:

类别中的cat的

工作中的工作
这样做
条件=工作是“某物”
除非有条件,否则就这样做
使用。由于CoffeeScript不支持它们,因此您需要进行如下操作:

0 && dummy
`CAT: //`
for cat in categories
  for job in jobs
    if conditionTerm == job
      do this
      `continue CAT` ## Iterate to the next cat in the first loop
  do that ## Execute upon eliminating all possibilities in the second for loop,
          ## but don't if the 'if conditionTerm' was met
Coffescript的“break”只会中断立即循环,无法识别外部循环是否会中断(令人讨厌!)。在某些情况下,当满足某个条件时,以下破解方法可用于断开多个循环:

ar1 = [1,2,3,4]
ar2 = [5,6,7,8]

for num1 in ar1
  for num2 in ar2
    console.log num1 + ' : ' + num2
    if num2 == 6
      breakLoop1 = true; break 
  break if breakLoop1

# Will print:
# 1 : 5
# 1 : 6

如果您想使用内部中断/继续,我想您的代码设计不是很好。 在我看来,任何编程语言都不允许这样做


按照某人的建议使用标签也被认为是不好的风格。

Coffeescript永远不会有多个中断/继续语句,您必须坚持使用丑陋且过多的标志污染代码,或者尝试用lambda替换它,并使用
return


对于检查数组中的所有元素,也许lodash的
每个
都有用


使用带返回的匿名循环

do ->
  for a in A
    for b in B 
      for c in C
        for d in D
          for e in E
            for f in F
              for g in G
                for h in H
                  for i in I
                    #DO SOMETHING
                    if (condition)
                      return true

谢谢里卡多,我不知道休息。但是,在if语句中加入条件语句将不起作用,因为“job”是在下面的“job in jobs”行中定义的,对吗?除非您提供一个重构的示例来证明您的pointwell,1)标签从来都不是好的。他们创造了意大利面条式的代码2)因为双断点不可用,人们总是可以使用内部条件,正如上面马克·帕森在回答中所描述的那样。这是一个基于语义的教条主张。不是所有所谓的“标签”都是相同的。两个级别的中断是简单和优雅的。请考虑添加代码来为您的请求提供理由。仅仅说“不好”并不能提供有用的反馈。谢谢!救了我的命:)(不受CoffeeScriptRedux支持)@AndreyM不。你可以认为标签本质上是对循环的命名。当您使用标签断开时,您不会转到带标签的行,而是使用指定的名称断开循环。看看我到底需要什么。非常感谢。您可能认为CoffeeScript会允许类似
的东西告诉编译器您指的是显式标签,而不是对象文字。例如,
topLoop::for i in names
到desugar to
topLoop:for(var i=0;…)
。反勾选也不总是可能的。而且,如果CoffeeScript在循环和hack之间插入一个中间赋值,这也不起作用。例如,
`NAME://`⮒ 对于键,@hash
的值编译为
NAME://;⮒ ref=this.hash;⮒ 对于(输入ref){
,这显然不起作用(⮒ 表示示例代码中的换行符)。解决方法是自己提供中间引用:
ref=@hash;`NAME://`⮒ 对于key,ref的value
JavaScript实际上支持使用中断外部循环,但是为了在CoffeeScript中实现这一点,您需要@matyr的答案中描述的hack。这令人印象深刻,甚至看起来很漂亮,但我不确定它会给公认的顶级答案增加什么。这确实是在CoffeeS中正确解决此问题的方法script-将代码组织成一个子函数,这样函数
return
就可以中断需要中断的最外层循环-否则,您将创建意大利面代码。这也一定是CoffeeScript中没有标签的设计原因。
do ->
  for a in A
    for b in B 
      for c in C
        for d in D
          for e in E
            for f in F
              for g in G
                for h in H
                  for i in I
                    #DO SOMETHING
                    if (condition)
                      return true