Zagnieżdżone jQuery.each () - continue / break

Rozważ następujący kod:

    var sentences = [
        'Lorem ipsum dolor sit amet, consectetur adipiscing elit.',
        'Vivamus aliquet nisl quis velit ornare tempor.',
        'Cras sit amet neque ante, eu ultrices est.',
        'Integer id lectus id nunc venenatis gravida nec eget dolor.',
        'Suspendisse imperdiet turpis ut justo ultricies a aliquet tortor ultrices.'
    ];

    var words = ['ipsum', 'amet', 'elit'];

    $(sentences).each(function() {
        var s = this;
        alert(s);
        $(words).each(function(i) {
            if (s.indexOf(this) > -1)
            {
                alert('found ' + this);
                return false;
            }
        });
    });

Interesującą częścią jest zagnieżdżone jQuery.pętle each (). Zgodnie z Dokumentacja, zwrócenie false spowoduje przerwanie pętli (zaprzestanie wykonywania pętli - podobne do normalnej instrukcji JavaScript break), a zwrócenie non-false zatrzyma bieżącą iterację i kontynuuje następną iterację (podobną do zwykłej instrukcji JavaScript continue).

Mogę złamać lub kontynuować jQuery.każdy () samodzielnie, ale z zagnieżdżone jQuery.każdego z nich, trudno było wyrwać się z pętli rodzica z wewnątrz pętli dziecka. Mógłbym użyć wartości logicznej i zaktualizować ją na każdej iteracji dziecka, ale zastanawiałem się, czy nie ma łatwiejszego sposobu.

Ustawiłem przykład w jsFiddle , jeśli chcesz z nim pogrywać. Wystarczy kliknąć przycisk "Test", aby uruchomić przykład pokazany powyżej.

TLDR: czy w kontekście jQuery?

Author: Ryan Kinal, 2010-07-16

10 answers

Powinieneś to zrobić bez jQuery, może nie jest tak "ładny" , ale mniej się dzieje i łatwiej jest robić dokładnie to, co chcesz, jak to:

var sentences = [
    'Lorem ipsum dolor sit amet, consectetur adipiscing elit.',
    'Vivamus aliquet nisl quis velit ornare tempor.',
    'Cras sit amet neque ante, eu ultrices est.',
    'Integer id lectus id nunc venenatis gravida nec eget dolor.',
    'Suspendisse imperdiet turpis ut justo ultricies a aliquet tortor ultrices.'
];

var words = ['ipsum', 'amet', 'elit'];

for(var s=0; s<sentences.length; s++) {
    alert(sentences[s]);
    for(var w=0; w<words.length; w++) {
        if(sentences[s].indexOf(words[w]) > -1) {
            alert('found ' + words[w]);
            return;
        }
    }
}

Możesz go wypróbować tutaj . Nie jestem pewien, czy to jest dokładnie zachowanie, którego szukasz, ale teraz nie jesteś w zamknięciu wewnątrz zamknięcia stworzonego przez podwójne .each() i możesz return lub break Kiedy tylko chcesz w tym przypadku.

 22
Author: Nick Craver,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-07-16 17:50:23

Jest tu wiele odpowiedzi. I to jest stare, ale to jest dla każdego, kto przychodzi tutaj przez google. W jQuery każda funkcja

return false; jest jak break.

Po prostu

return; jest jak continue

Będą one naśladować zachowanie break I continue.

 89
Author: Thihara,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-10-11 09:17:51

Jak podano w dokumentacji jQuery http://api.jquery.com/jQuery.each/ A return true; jest takie samo jak A continue; W pętli, a a return false; jest takie samo jak a break;

 13
Author: Serj Sagan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-08-16 15:31:44

Nie ma czystego sposobu, aby to zrobić i tak jak @Nick wspomniano powyżej, może być po prostu łatwiejsze użycie old school way of loops, ponieważ wtedy możesz to kontrolować. Ale jeśli chcesz trzymać się tego, co masz, możesz sobie z tym poradzić. Jestem pewien, że będę miał za to trochę ciepła. Ale...

Jednym ze sposobów, w jaki możesz zrobić to, co chcesz bez instrukcji if, jest wywołanie błędu i zawinięcie pętli blokiem try/catch:

try{
$(sentences).each(function() {
    var s = this;
    alert(s);
    $(words).each(function(i) {
        if (s.indexOf(this) > -1)
        {
            alert('found ' + this);
            throw "Exit Error";
        }
    });
});
}
catch (e)
{
    alert(e)
}

Ok, zaczynajmy.

 8
Author: spinon,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-07-16 17:55:41

Problem polega na tym, że podczas gdy możesz zwrócić false z wywołania zwrotnego .each, Funkcja .each sama zwraca obiekt jQuery. Więc musisz zwrócić false na obu poziomach, aby zatrzymać iterację pętli. Również ponieważ nie ma sposobu, aby dowiedzieć się, czy wewnętrzna .each znalazła dopasowanie, czy nie, będziemy musieli użyć współdzielonej zmiennej za pomocą zamknięcia, które zostanie zaktualizowane.

Każda wewnętrzna iteracja words odnosi się do tej samej zmiennej notFound, więc musimy ją zaktualizować, gdy dopasowanie jest znalazłem, a potem go zwrócę. Zewnętrzne zamknięcie ma już odniesienie do niego, więc może break wyjść w razie potrzeby.

$(sentences).each(function() {
    var s = this;
    var notFound = true;

    $(words).each(function() {
        return (notFound = (s.indexOf(this) == -1));
    });

    return notFound;
});

Możesz wypróbować swój przykład tutaj.

 7
Author: Anurag,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-07-16 18:33:51

Niestety nie. Problem polega na tym, że iteracja odbywa się wewnątrz funkcji, więc nie są one jak normalne pętle. Jedynym sposobem na "wyłamanie" się z funkcji jest zwrócenie lub wyrzucenie wyjątku. Tak więc tak, użycie flagi logicznej wydaje się być jedynym rozsądnym sposobem na "wyrwanie" się z zewnętrznej "pętli".

 4
Author: casablanca,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-07-16 17:50:39

Return true not work

Return false working

found = false;
query = "foo";

$('.items').each(function()
{
  if($(this).text() == query)
  {
    found = true;
    return false;
  }
});
 4
Author: misima,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-03-18 00:23:42

Użyłem do tego wzoru "breakout":

$(sentences).each(function() {
    var breakout;
    var s = this;
    alert(s);
    $(words).each(function(i) {
        if (s.indexOf(this) > -1)
        {
            alert('found ' + this);
            return breakout = false;
        }
    });
    return breakout;
});
To działa ładnie na każdą głębokość zagnieżdżania. breakout jest prostą flagą. Zostanie undefined dopóki nie ustawisz go na false (tak jak to robię w moim oświadczeniu zwrotnym, jak pokazano powyżej). Wszystko co musisz zrobić to:
  1. zadeklaruj to w swoim zewnętrznym zamknięciu: var breakout;
  2. dodaj go do swojej return false wypowiedzi: return breakout = false
  3. return breakout w zewnętrznym zamknięciu (- ach).
Nie zbyt nieeleganckie, prawda? ...działa dla mnie w każdym razie.
 4
Author: joneit,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-04-02 03:59:32

Potwierdź w dokumentacji API http://api.jquery.com/jQuery.each / powiedz:

Możemy złamać $.każda pętla () w określonej iteracji poprzez funkcja callback zwraca false. Zwracanie non-false jest takie samo jak polecenie continue w pętli for; przejdzie natychmiast do następnego iteracja.

A to jest mój przykład http://jsfiddle.net/r6jqP/

(function($){
    $('#go').on('click',function(){
        var i=0,
            all=0;
        $('li').each(function(){
             all++;
             if($('#mytext').val()=='continue')return true;
             i++;
             if($('#mytext').val()==$(this).html()){
                 return false;
             }
        });
        alert('Iterazione : '+i+' to '+all);
    });
}(jQuery));
 3
Author: Leonardo Ciaccio,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-06-15 12:53:24

Tagged Break

outerloop:
$(sentences).each(function() 
{
    $(words).each(function(i) 
    {
        break; /* breaks inner loop */
    } 
    $(words).each(function(i)  
    {
        break outerloop; /* breaks outer loop */
    }
}
 2
Author: capdragon,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-05-15 14:29:46