45 votes

JQuery.each() imbriqué - continuer/rompre

Considérons le code suivant :

    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;
            }
        });
    });

La partie intéressante est l'imbrication des boucles jQuery.each(). D'après la documentation Le retour de l'instruction false permet de sortir de la boucle (en interrompant l'exécution de la boucle - de façon similaire à l'instruction break de JavaScript), et le retour de l'instruction non-false permet d'arrêter l'itération en cours et de poursuivre l'itération suivante (de façon similaire à l'instruction continue de JavaScript).

Je peux interrompre ou poursuivre un jQuery.each() seul, mais avec des jQuery.each imbriqués, il m'est difficile de sortir de la boucle parent à l'intérieur de la boucle enfant. Je pourrais utiliser une valeur booléenne et la mettre à jour à chaque itération de l'enfant, mais je me demandais s'il existait un moyen plus simple.

J'ai mis en place un exemple chez jsFiddle si vous voulez vous amuser avec. Il suffit de cliquer sur le bouton "Test" pour exécuter l'exemple ci-dessus.

TLDR : Existe-t-il quelque chose qui ressemble à une étiquette continue ou break dans le contexte de jQuery ?

2 votes

On dirait que tu utilises trop de jQuery ici, un simple for

3 votes

Il s'agit d'un exemple très simplifié. En réalité, je boucle sur les nœuds du DOM sélectionnés par jQuery, etc.

93voto

Thihara Points 3969

Il y a beaucoup de réponses ici. Et c'est vieux, mais c'est pour ceux qui viennent ici via google. Dans jQuery, chaque fonction

return false; c'est comme break .

juste

return; c'est comme continue

Ceux-ci émuleront le comportement de break et continue.

1 votes

Veuillez consulter la réponse de Serj. Elle a été déclassée parce que vous ne peut pas ont un étiqueté return true ou return false

1 votes

En fait j'ai essayé return true dans firefox et c'était la même chose que break pour moi. C'est la raison de ma réponse.

10 votes

Qui ne sort pas d'une emboîté boucle.

23voto

Nick Craver Points 313913

Vous devez faire ceci sans jQuery, ce n'est peut-être pas aussi "joli", mais il y a moins de choses à faire et il est plus facile de faire exactement ce que vous voulez, comme ceci :

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;
        }
    }
}

Vous pouvez l'essayer ici . Je ne suis pas sûr que ce soit le exact que vous recherchez, mais maintenant vous n'êtes pas dans une fermeture à l'intérieur d'une fermeture créée par le double .each() et vous pouvez return ou break quand vous le souhaitez dans ce cas.

0 votes

Très bon point. Même avec l'utilisation plus compliquée des sélecteurs DOM de jQuery qui constitue mon cas d'utilisation actuel, ils peuvent être itérés normalement.

0 votes

Le JavaScript normal obtient le chèque. Mec, j'adore ce langage.

1 votes

Cette solution est impeccablement correcte, mais elle ne répond pas à la question posée. Elle n'explique pas comment sortir d'une chaîne de boucles 'each' imbriquées. donc -1 (désolé)

14voto

Serj Sagan Points 2731

Comme il est indiqué dans la documentation de jQuery http://api.jquery.com/jQuery.each/

return true sur jQuery.each est la même chose qu'un continue

return false est la même chose qu'un break

1 votes

$(selector).each() VS $.each(set) - J'espère que cela fonctionne de la même manière :)

8voto

spinon Points 6362

Il n'y a pas de manière propre de faire cela et comme @Nick l'a mentionné plus haut, il pourrait être plus facile d'utiliser la vieille méthode des boucles car vous pouvez alors contrôler cela. Mais si vous voulez vous en tenir à ce que vous avez, il y a une façon de gérer cela. Je suis sûr que je vais être un peu critiqué pour cela. Mais...

Une façon de faire ce que vous voulez sans instruction if est de lever une erreur et d'entourer votre boucle d'un bloc 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, que la raclée commence.

7 votes

Wow. C'est peut-être un abus flagrant de try/catch, mais ça marche.

0 votes

Ryan, oui je sais. Cela va complètement à l'encontre de ce qu'on nous apprend à faire. Mais j'essayais juste de proposer une solution.

1 votes

Heureux d'aider alors. Je suis surpris qu'il n'y ait pas vraiment eu de bagarre. Ce doit être la lumière aujourd'hui ou le fait que je reconnaisse moi-même que l'approche n'est pas la meilleure.

8voto

Anurag Points 66470

Le problème ici est que, bien que vous puissiez renvoyer false à partir de la fonction .each le rappel .each renvoie elle-même l'objet jQuery. Vous devez donc retourner un false aux deux niveaux pour arrêter l'itération de la boucle. De plus, comme il n'y a aucun moyen de savoir si la fonction interne .each a trouvé une correspondance ou non, nous devrons utiliser une variable partagée en utilisant une fermeture qui est mise à jour.

Chaque itération interne de words fait référence au même notFound Il nous suffit donc de la mettre à jour lorsqu'une correspondance est trouvée, puis de la renvoyer. La fermeture externe a déjà une référence à cette variable, elle peut donc break en cas de besoin.

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

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

    return notFound;
});

Vous pouvez essayer votre exemple ici .

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X