44

次のコードを検討してください。

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

興味深い部分は、ネストされた jQuery.each() ループです。ドキュメントに従って、 false を返すとループから抜け出し (通常の JavaScript の break ステートメントと同様にループの実行を中止します)、false 以外を返すと現在の反復を停止し、次の反復を続行します (通常の反復と同様)。 JavaScript の continue ステートメント)。

jQuery.each() を単独で中断または続行することはできますが、ネストされた jQuery.each では、子ループ内から親ループから抜け出すのが難しいことがわかりました。ブール値を使用して、子の反復ごとに更新することもできましたが、もっと簡単な方法があるかどうか疑問に思っていました。

いじりたい場合は、jsFiddle で例を設定しました。「テスト」ボタンをクリックするだけで、上記の例を実行できます。

TLDR: jQuery のコンテキスト内で、ラベル付けされた継続または中断に似たものはありますか?

4

11 に答える 11

92

ここにはたくさんの答えがあります。そして、それは古いですが、これはグーグル経由でここに来る人のためのものです. jQueryでは各関数

return false;のようbreakです。

ただ

return;のようなものですcontinue

これらは、ブレーク アンド コンティニューの動作をエミュレートします。

于 2012-10-11T09:17:51.580 に答える
22

jQueryなしでこれを行う必要があります。「きれい」ではないかもしれませんが、次のように、必要なことを正確に実行する方が簡単です。

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

ここで試すことができますこれがあなたが求めている正確な動作であるかどうかはわかりませんが、今は double によって作成されたクロージャー内のクロージャーではなく、この場合はいつでもでき.each()ますreturnbreak

于 2010-07-16T17:50:23.913 に答える
12

jQueryのドキュメントhttp://api.jquery.com/jQuery.each/に記載されているように

return trueinjQuery.eachは a と同じですcontinue

return falseと同じですbreak

于 2012-08-16T15:31:44.343 に答える
8

ここでの問題は、.eachコールバック内から false を返すことはできますが、.each関数自体が jQuery オブジェクトを返すことです。したがって、ループの反復を停止するには、両方のレベルで false を返す必要があります。.eachまた、インナーが一致したかどうかを知る方法がないため、更新されるクロージャーを使用して共有変数を使用する必要があります。

の各内部反復はwords同じnotFound変数を参照するため、一致が見つかったときにそれを更新し、それを返すだけで済みます。外側のクロージャーには既にそれへの参照があるためbreak、必要に応じてアウトできます。

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

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

    return notFound;
});

ここで例を試すことができます。

于 2010-07-16T17:59:13.417 に答える
8

There is no clean way to do this and like @Nick mentioned above it might just be easier to use the old school way of loops as then you can control this. But if you want to stick with what you got there is one way you could handle this. I'm sure I will get some heat for this one. But...

One way you could do what you want without an if statement is to raise an error and wrap your loop with a try/catch block:

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, let the thrashing begin.

于 2010-07-16T17:55:41.693 に答える
6

これには「ブレイクアウト」パターンを使用しました。

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

これは、ネストの深さに関係なくうまく機能します。breakout単純なフラグです。undefined設定しない限り、設定するまでそのままです(false上記の return ステートメントで行っているように)。あなたがしなければならないことは次のとおりです。

  1. 最も外側のクロージャーで宣言します。var breakout;
  2. それをあなたの声明に追加してくださいreturn falsereturn breakout = false
  3. 外側のクロージャーにブレークアウトを返します。

あまりにもエレガントではありませんよね?...とにかく私のために働きます。

于 2014-04-02T03:59:32.970 に答える
3

true を返す機能しない

偽の作業を返す

found = false;
query = "foo";

$('.items').each(function()
{
  if($(this).text() == query)
  {
    found = true;
    return false;
  }
});
于 2011-03-18T00:23:42.333 に答える
3

残念だけど違う。ここでの問題は、反復が関数内で発生するため、通常のループとは異なることです。関数を「中断」できる唯一の方法は、戻るか、例外をスローすることです。そうです、ブール値フラグを使用することが、外側の「ループ」から「抜け出す」ための唯一の合理的な方法のようです。

于 2010-07-16T17:50:39.627 に答える
2

ラベル付き休憩

outerloop:
$(sentences).each(function() 
{
    $(words).each(function(i) 
    {
        break; /* breaks inner loop */
    } 
    $(words).each(function(i)  
    {
        break outerloop; /* breaks outer loop */
    }
}
于 2012-05-15T14:29:46.820 に答える
2

APIドキュメントhttp://api.jquery.com/jQuery.each/で確認してください:

コールバック関数が false を返すようにすることで、特定の反復で $.each() ループを中断できます。false 以外を返すことは、for ループの continue ステートメントと同じです。次の繰り返しにすぐにスキップします。

これは私の例です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));
于 2013-06-15T12:53:24.120 に答える