jQuery.each()ユーティリティの次の反復にスキップする方法は?


434

要素の配列を反復処理しようとしています。jQueryのドキュメントは言う:

jquery.Each()のドキュメント

false以外の値を返すことは、forループのcontinueステートメントと同じで、次の反復にすぐにスキップされます。

「return non-false;」を呼び出してみました。そして「偽ではない」; (戻り値)どちらも次の反復にスキップしません。代わりに、それらはループを壊します。何が欠けていますか?


9
彼らの無限の知恵で、jQueryのbodsはこのメモをドキュメントから削除しました-または、少なくとも、each()のページにはありません。だから私はこの質問がまだSOで、さらにGoogleで見つけられることをとても嬉しく思っています。これは私がいつも忘れている単純なことの1つであるためです。)
Doug McLean

回答:


783

彼らが偽ではないことの意味は:

return true;

したがって、このコード:

var arr = ["one", "two", "three", "four", "five"];
$.each(arr, function(i) {
  if (arr[i] == 'three') {
    return true;
  }
  console.log(arr[i]);
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>

ログに記録されますonetwofourfive


16
現在の反復のみを終了するには、「return」を返すだけで十分です。また、すべての反復を終了するには、falseを返します。
Saulius

7
これが機能するのは、このコードが実行されたときに関数内にいるためです。
Ukuser32、2016

私が戻るとき(arr [i] === 'three'); なぜそれが機能していないのですか?
ajayv

私にとって、偽ではないということは、偽を返す以外は何でも返すことができるということです。
Hoang Trung 2018年

61

「非偽を返す」とは、うまくいかない値をブール偽に返すことを意味します。あなたが返すことができるようにtrue1'non-false'、または任意の他、あなたは最高だと思うことができます。


20
明示のためだけではなく、「リターン '継続';」
Alexander Mills、

続行についてはどうですか?それは私が使用したCシャープのバリエーションで機能したので、JSでも同様の効果があると推測しています
Brandito

@Branditoこれは通常のループのように実行されているのではなく、関数を再帰的に呼び出しているため、ループを継続するには、関数内の処理を終了する必要があります。
TJ L

5

Javascriptには、「真実性」と「虚偽性」という考え方があります。変数に値がある場合、一般的には9)変数に「真実性」があります-null、または値が「偽り」になる傾向はありません。以下のスニペットが役立つかもしれません:

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

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

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

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

うまくいけばそれは役に立ちますか?

また、ダグラス・クロックフォードからこれらのビデオをチェックする価値があります

更新:壊れたリンクを発見してくれて@cphpythonに感謝-作業中のバージョンを指すように更新しました

JavaScript言語

Javascript-良い部分


1
リンクは壊れています...ところで、これ0も偽の値であり、その否定は真実です(他の数値への逆も同様!-42 === falseです)。
CPHPython 2018

4

次の反復に到達するために、ブロックの最後から落ちることがあることを忘れないでください。

$(".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年生の

@DanielParejoMuñoz、私はあなたの言うことを聞きますが、私たちは同意しません。returnステートメントを持たないという選択は、あなたが好きなものではないかもしれません。しかし、私はそれが良い/悪いものではなく、好き/嫌いなものであると私は提出します。どちらも客観的に明確な利点はありません。
Lee Meador 2016

4
これにはネストが増えるという欠点があります
Dave Cousineau

3

ループは、文字どおりに戻った場合にのみ中断します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に適用されます。しかし、実際には、関数の最下部を終了すると、何も返さないので、ループが継続するので、何も返さずにループを継続できなかった可能性はまったくないと思います。ループを続行するために何かを返すことを全員に強制したい場合を除き、何も返さなくもループを継続できます。


-3

jQuery.noop()が役立ちます

$(".row").each( function() {
    if (skipIteration) {
        $.noop()
    }
    else{doSomething}
});

いいえ、このnoop()関数はまったく役に立ちません。「else」ブロックがアクティブになっていないためにのみ機能します。
Rauni Lillemets 2017
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.