Как перейти к следующей итерации в утилите jQuery.each ()?

434

Я пытаюсь перебрать массив элементов. Документация jQuery гласит:

jquery.Each () документация

Возврат non-false - это то же самое, что и оператор continue в цикле for, он будет сразу пропущен до следующей итерации.

Я пытался позвонить «вернуть не ложь»; и «не ложь»; (без возврата), ни один из которых не пропускается к следующей итерации. Вместо этого они разрывают петлю. Что мне не хватает?

мистифицировать
источник
9
В своей бесконечной мудрости, органы jQuery теперь удалили эту заметку из документации - или, по крайней мере, ее нет на странице для каждого () . Так что я очень рад, что этот вопрос все еще можно найти здесь, на SO, и, соответственно, в Google, поскольку это одна из тех простых вещей, которые я всегда забываю :)
Даг Маклин,

Ответы:

783

Что они подразумевают под не ложным:

return true;

Итак, этот код:

var arr = ["one", "two", "three", "four", "five"];
$.each(arr, function(i) {
  if (arr[i] == 'three') {
    return true;
  }
  console.log(arr[i]);
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>

зарегистрирует one, two, four, five.

Паоло Бергантино
источник
16
Чтобы выйти только из текущей итерации, достаточно просто вернуть 'return'. И для выхода из всех итераций вперед вернуть false.
Саулюс
7
Стоит сказать, что это работает, потому что вы находитесь внутри функции, когда этот код выполняется.
Ukuser32
когда я вернусь (arr [i] === 'three'); почему не работает ??
ajayv
Для меня не-ложное среднее, вы можете вернуть все, кроме возврата ложного;
Хоанг Чунг
61

Под «возвратом не ложного» они подразумевают возвращение любого значения, которое не сработает, до логического значения «ложь». Таким образом , вы могли бы вернуться true, 1, 'non-false', или то , что вы можете придумать.

TJ L
источник
20
почему бы просто ради "возврата" продолжить ";
Александр Миллс
что насчет продолжения? это работало в вариации до-диеза, с которой я работал, поэтому я только предполагаю, что это будет иметь аналогичный эффект в JS
Брандито
@Brandito Он не работает как обычный цикл - он вызывает функцию рекурсивно, поэтому для продолжения цикла необходимо завершить обработку внутри функции.
TJ L
5

В Javascript есть идея «правдивости» и «ложности». Если переменная имеет значение, то, как правило, 9, как вы увидите), она имеет «истинность» - ноль, или никакое значение не стремится к «ложности». Следующие фрагменты могут помочь:

var temp1; 
if ( temp1 )...  // false

var temp2 = true;
if ( temp2 )...  // true

var temp3 = "";
if ( temp3 ).... // false

var temp4 = "hello world";
if ( temp4 )...  // true

Надеюсь, это поможет?

Кроме того, стоит проверить эти видео от Дугласа Крокфорда

обновление: спасибо @cphpython за обнаружение неработающих ссылок - я обновился, чтобы указать на рабочие версии сейчас

Язык Javascript

Javascript - хорошие части

mlennox
источник
1
Ссылки не работают ... Кстати, 0это также ложное значение, и отрицание его является правдивым (и наоборот, к любому другому числу, например !-42 === false).
CPHPython
4

Не забывайте, что иногда вы можете просто упасть с конца блока, чтобы перейти к следующей итерации:

$(".row").each( function() {
    if ( ! leaveTheLoop ) {
        ... do stuff here ...
    }
});

Вместо того, чтобы возвращаться так:

$(".row").each( function() {
    if ( leaveTheLoop ) 
        return; //go to next iteration in .each()
    ... do stuff here ...
});
Ли Меадор
источник
3
Я не хочу быть грубым, но это ужасно ужасный дизайн. Я имею в виду ... Я сделал это, в мои 2 первых года обучения в колледже, когда я не знал лучше (даже тогда мне это не нравилось), но это не то, что следует советовать ...
xDaizu
@ DanielParejoMuñoz, я тебя слышу, но мы не согласны. Выбор не иметь оператора возврата может быть не тем, что вам нравится. Но я бы сказал, что это вещь нравится / не нравится, а не хорошая / плохая вещь. Ни один из них не имеет явных преимуществ объективно.
Ли Меадор
4
у этого есть недостаток увеличения вложенности
Дэйв Кузино
3

Цикл прерывается, только если вы вернетесь буквально false. Пример:

// this is how jquery calls your function
// notice hard comparison (===) against false
if ( callback.call( obj[ i ], i, obj[ i ] ) === false ) {
   break;
}

Это означает, что вы можете вернуть что-нибудь еще, включая то undefined, что вы возвращаете, если ничего не возвращаете, так что вы можете просто использовать пустой оператор return:

$.each(collection, function (index, item) {
   if (!someTestCondition)
      return; // go to next iteration

   // otherwise do something
});

Возможно, это может варьироваться в зависимости от версии; это применимо для jquery 1.12.4. Но на самом деле, когда вы выходите из нижней части функции, вы также ничего не возвращаете, и поэтому цикл продолжается, поэтому я ожидаю, что нет никакой возможности, что возврат ничего не мог бы продолжить цикл. Если они не хотят заставить всех начать возвращать что-то, чтобы поддерживать цикл, возврат ничего не должен быть способом, чтобы продолжать это.

Дейв Кузино
источник
-3

jQuery.noop () может помочь

$(".row").each( function() {
    if (skipIteration) {
        $.noop()
    }
    else{doSomething}
});
melaxon
источник
Нет, эта функция noop () никак не помогает. Работает только потому, что блок else еще не активирован.
Рауни