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

336

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

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

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

Я пробовал называть 'return non-false'; и "неверный"; (sans return), ни один из которых не переходит к следующей итерации. Вместо этого они прерывают цикл. Что мне не хватает?

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

6 ответов

630
Лучший ответ

То, что они подразумевают под неверным, это:

return true;

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

var arr = [ "one", "two", "three", "four", "five" ];
$.each(arr, function(i) {
    if(arr[i] == 'three') {
        return true;
    }
    alert(arr[i]);
});

Будет предупреждать один, два, четыре, пять

  • 15
    Чтобы выйти только из текущей итерации, достаточно просто вернуть 'return'. И для выхода из всех итераций вперед верните false.
  • 7
    Стоит сказать, что это работает, потому что вы находитесь внутри функции, когда этот код выполняется.
Показать ещё 2 комментария
54

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

  • 20
    почему бы просто ради "возврата" продолжить ";
  • 0
    что насчет продолжения? это работало в вариации C sharp, с которой я работал, поэтому я только предполагаю, что это будет иметь аналогичный эффект в JS
Показать ещё 1 комментарий
5

У Javascript есть идея "правды" и "фальшивости". Если переменная имеет значение, тогда, как правило, вы увидите, что она имеет "правду" - значение null, или никакое значение не стремится к "ложности". Ниже приведенные ниже фрагменты могут помочь:

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

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

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

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

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

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

Язык Javascript

Javascript - Хорошие детали

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

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

$(".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 первых года обучения в колледже, когда я не знал лучше (даже тогда мне это не нравилось), но это не то, что следует советовать ...
  • 0
    @ DanielParejoMuñoz, я слышу тебя, но мы не согласны. Выбор не иметь оператора возврата может быть не тем, что вам нравится. Но я бы сказал, что это нравится / не нравится, а не хорошо / плохо. Ни у одного нет явных преимуществ объективно.
Показать ещё 1 комментарий
0

Цикл только ломается, если вы вернетесь буквально 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. Но на самом деле, когда вы выходите из нижней части функции, вы также ничего не возвращаете, и поэтому цикл продолжается, поэтому я ожидаю, что нет никакой возможности, чтобы возвращающее ничего не могло продолжить цикл. Если они не хотят заставить всех начать что-то возвращать, чтобы сохранить цикл, возвращение ничего не должно быть способом, чтобы сохранить его.

0

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

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню