Подтвердить что ты не робот

Ломать/Продолжать вложенные петли в 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 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
4b9b3361

Ответ 1

break работает так же, как js:

for cat in categories
  for job in jobs
    if condition
      do this
      break ## Iterate to the next cat in the first loop

Ваш второй случай не очень ясен, но я предполагаю, что вы этого хотите:

for cat in categories
    for job in jobs
      do this
      condition = job is 'something'
    do that unless condition

Ответ 2

Используйте метки. Поскольку 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

Ответ 3

"break" Coffescript только разрывает ближайший цикл и не имеет возможности идентифицировать внешний цикл для поломки (раздражает!). Этот следующий хак работает в некоторых случаях для выхода из нескольких циклов при выполнении условия:

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

Ответ 4

Использование анонимного цикла с возвратом

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

Ответ 5

У Coffeescript никогда не будет много разрывающих/продолжающих утверждений, вы должны придерживаться уродливых и чрезмерных флагов, загрязняющих ваш код, или попытаться заменить его на do на лямбда и использовать return как множественный разрыв.

https://github.com/jashkenas/coffeescript/issues/4254

Ответ 6

Для проверки всех элементов в массиве может понадобиться lodash every?

https://lodash.com/docs#every

for cat in categories
  if _.every jobs, conditionTerm
...

Ответ 7

Я предполагаю, что дизайн вашего кода не очень хорош, если вы хотите использовать внутренний break/continue. Мне кажется, что любой язык программирования не позволяет этого.

Использование меток, как кто-то предложил, также считается плохим.