#javascript #jquery #loops #next
#javascript #jquery #циклы #Далее
Вопрос:
У меня есть этот код, где я хотел бы, чтобы next
переход к следующей итерации выполнялся.
$.each(result, function(key, value) {
if (value.type == "individuel") {
cform["IN"] = "checked";
} else if (value.type == "course") {
cform["CO"] = "checked";
} else {
next;
}
cform["ID"] = key;
cform["title"] = value.title;
$('#template').tmpl(cform).appendTo('#content');
});
Но next
очевидно, означает нечто отличное от того, что я ожидал.
Мне кажется, что next
завершается $.each
, а не пропускается текущий ключ / значение.
Существует ли способ сделать next
так, как я ожидал?
Комментарии:
1.
next
это не ключевое слово или зарезервированное слово в Javascript, поэтому, если оно не было где-то определено как переменная, включениеnext
в ваш код должно вызыватьReferenceError
Ответ №1:
Из-за природы jQuery невозможно указать «next» в теле функции. Внутренняя функция не знает, что она выполняется в цикле, и поэтому не может повлиять на этот факт.
Но вы можете вернуться раньше, что приведет к тому же эффекту:
$.each(result, function(key, value) {
if (value.type == "individuel") {
cform["IN"] = "checked";
} else if (value.type == "course") {
cform["CO"] = "checked";
} else {
return true;
}
cform["ID"] = key;
cform["title"] = value.title;
$('#template').tmpl(cform).appendTo('#content');
});
Я нахожу это более стильным:
$.each(result, function(key, value) {
switch (value.type) {
case "individuel": cform["IN"] = "checked"; break;
case "course": cform["CO"] = "checked"; break;
default: return true;
}
cform["ID"] = key;
cform["title"] = value.title;
$('#template').tmpl(cform).appendTo('#content');
});
Комментарии:
1. Будьте осторожны, это
return false
прерывает весь цикл и приводит к короткому замыканию.
Ответ №2:
В отличие от других конструкций, таких как for..in
и while
, $.each
не является языковой конструкцией. С помощью этих конструкций вы можете использовать continue
, чтобы пропустить текущий элемент и break
выйти из цикла. Поскольку $.each
принимает функцию обратного вызова, вам нужно использовать return
значение обратного вызова, чтобы повлиять на то, что произойдет дальше.
Возврат true
для перехода к следующему элементу; возврат false
для прерывания цикла.
В этом случае вам следует использовать return true
:
else {
return true; // skip to next element
}
Ответ №3:
возвращает true;
Из документов:
Мы можем прервать цикл $.each() на определенной итерации, заставив функцию обратного вызова возвращать значение false . Возврат значения, отличного от false, аналогичен оператору continue в цикле for; он немедленно перейдет к следующей итерации.
Ответ №4:
Использование оператора if делает следующий ненужным. Просто делайте все, что хотите, в if и игнорируйте else. Итерация выполняется автоматически.
Комментарии:
1. Не будет ли у меня тогда один и тот же код дважды? Ie. последние 3 строки кода будут в каждом
if
-операторе. Это упрощенный пример. Там еще примерно на 20 строк кода больше.2. Вам нужно будет настроить свой оператор if в соответствии с вашими целями. При каких условиях вам нужно выполнить 20 строк кода? Затем установите это условие и запустите их, затем разбейте на более конкретные случаи.
Ответ №5:
Используйте continue;
для перехода к следующей итерации в цикле.
Редактировать: Да, извините за это, клянусь, я видел там цикл: ( Вы можете «продолжить» в jQuery each(), вернув значение, отличное от false, будет ли возврат работать в вашем случае?
Комментарии:
1. Я отредактировал свой ответ.. @Raynos, означает ли это, что я не могу использовать continue в
while
🙂