Ломать/Продолжать вложенные петли в 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
Ответы
Ответ 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.
Мне кажется, что любой язык программирования не позволяет этого.
Использование меток, как кто-то предложил, также считается плохим.