Как вырвать из jQuery каждый цикл

677

Как выйти из eachцикла jQuery ?

Я пытался:

 return false;

В цикле, но это не сработало. Любые идеи?

Luke101
источник
11
Для потомков: почему спрашивающий сказал, что возвращение false не работает? Практически каждый ответ говорит об этом. Интересно, возможно ли это потому, что это завершает только каждый цикл. Оператор return внутри цикла for, напротив, выходит из цикла и вызывающей функции . Чтобы получить такое резкое поведение от каждого цикла, вам нужно установить флаг с closure-scope внутри каждого цикла, а затем ответить на флаг вне его.
Боб Стейн
8
@ BobStein-VisiBone Кто-то удалил мой оригинальный комментарий. Я поставил не return falseв том месте. Когда я это исправил, все заработало.
Luke101
1
не уверен, почему «обновление» говорит, return falseчто не работает $().each- потому что это работает.
Billynoah
2
@ Luke101 вы должны обновить вопрос, чтобы было понятно, что не работает. Этот вопрос не имеет смысла, когда ваш вопрос говорит, что принятый ответ не работает.
xr280xr

Ответы:

1183

Для breakболее $.eachили $(selector).eachпетли, вы должны вернуться falseв функции обратного вызова цикла.

Возвращение trueпропускает к следующей итерации, эквивалентной a continueв нормальном цикле.

$.each(array, function(key, value) { 
    if(value === "foo") {
        return false; // breaks
    }
});

// or

$(selector).each(function() {
  if (condition) {
    return false;
  }
});
CMS
источник
3
Просто то, что я искал, спасибо. @OZZIE, просто используй «верни истину»; или "вернуть ложь"; исходя из ваших условий.
дчайка
2
Что означает @CMS с «обратным вызовом возврата falseв цикле»? Где именно это?
mesqueeb
Например$.each(array, function(key, value) { if(value == "foo") return false; });
SteveEdson
1
Не знаю, jQuery пришлось поменять позиции параметров из javascript forEach.
Mikee
1
@AlexR Выделение a $().eachвыполняется точно так же, ваше редактирование только вызывает путаницу.
Джейк
57

По документации return false;следует выполнить работу.

Мы можем разорвать цикл $ .each () [..], заставив функцию обратного вызова вернуть false.

Вернуть false в обратном вызове:

function callback(indexInArray, valueOfElement) {
  var booleanKeepGoing;

  this; // == valueOfElement (casted to Object)

  return booleanKeepGoing; // optional, unless false 
                           // and want to stop looping
}

Кстати, continueработает так:

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

powtac
источник
35

Я создал Fiddle для ответа на этот вопрос, потому что принятый ответ неверен, плюс это первая ветка StackOverflow, возвращенная Google по этому вопросу.

Чтобы вырваться из $ .each, вы должны использовать return false;

Вот Скрипка, доказывающая это:

http://jsfiddle.net/9XqRy/

iamjpg
источник
14
Мне нравится скрипка, но я не уверен, почему вы говорите, что принятый ответ неверен, потому что вы оба говорите одно и то же.
Гитситго
34

Я столкнулся с ситуацией, когда я встретил условие, которое нарушило цикл, однако код после функции .each () все еще выполнялся. Затем я установил флаг в «true» с немедленной проверкой флага после функции .each (), чтобы убедиться, что следующий код не был выполнен.

$('.groupName').each(function() {
    if($(this).text() == groupname){
        alert('This group already exists');
        breakOut = true;
        return false;
    }
});
if(breakOut) {
    breakOut = false;
    return false;
} 
Дэвид Агирре
источник
7

«каждый» использует функцию обратного вызова. Функция обратного вызова выполняется независимо от вызывающей функции, поэтому невозможно вернуться к вызывающей функции из функции обратного вызова.

используйте цикл for, если вам нужно остановить выполнение цикла на основе некоторого условия и остаться в той же функции.

Sumit Jambhale
источник
6

Я знаю, что это довольно старый вопрос, но я не видел никакого ответа, который разъясняет, почему и когда его можно порвать с возвращением.

Я хотел бы объяснить это на двух простых примерах:

1. Пример: в этом случае у нас есть простая итерация, и мы хотим порвать с возвращением true, если мы можем найти три.

function canFindThree() {
    for(var i = 0; i < 5; i++) {
        if(i === 3) {
           return true;
        }
    }
}

если мы вызовем эту функцию, она просто вернет истину.

2. Пример В этом случае мы хотим перебрать каждую функцию jquery , которая принимает анонимную функцию в качестве параметра.

function canFindThree() {

    var result = false;

    $.each([1, 2, 3, 4, 5], function(key, value) { 
        if(value === 3) {
            result = true;
            return false; //This will only exit the anonymous function and stop the iteration immediatelly.
        }
    });

    return result; //This will exit the function with return true;
}
Vural
источник