2014-01-16 19 views
6

eachとコールバックコールなしでjQueryコレクションをループしたいと思います。それぞれとコールバック関数を持たないjQueryループ

私はfound1たらコード

var found1 = false; 
$('#Root div.ListItem').each(function(index, d1) { 
    if (group == d1.text()){ found1 = true; } 
}); 

if(found1){ 
    return; 
} 

を以下しているが、それは常に真である真次の時間が設定されています。私はループを切断する方法を疑問に思っていないです

UPDATE

for(var id in $('#Root div.ListItem')) { ... } 

ようeachせずにどのようにループに知っていて、コールバックしたいと思います。 コールバックを渡したくないeach

ループ内でjQueryオブジェクトを渡すと、私は多くのキーを取得します。

http://jsfiddle.net/LwTGU/

その例では、1つの子要素の1つの鍵があるかもしれません。

答えて

7

あなたの試みは、実際にjQuery配列のようなオブジェクトのプロパティのすべてを反復処理されます。

for (var id in $('#Root div.ListItem')) { 
    // id is the name of the property 
} 

あなたはこれを望んでいません。出力は、あなたが期待していた何かであることを

for (var id in $('#root span').toArray()) { // convert to native array 
    // id is now an element found by the selector 
    $('<div />', {text: $(id).text()}).appendTo($('#out')); 
} 

You'll see in the above:あなたは配列のようなオブジェクトで要素を反復する必要があります。

元の質問に戻ってください。マッチを見つけたらループから脱出する必要があるように思えます。 jQuery eachループから抜け出す方法を知りたい場合は、found1 = true;を設定した後にreturn false;と入力するだけです。あなたはコールバックを渡すことを恐れるべきではありません。そのコールバックは、通常の古いfor-loop「under-the-hood」のセレクタの各要素に対してただ実行されます。あなたが本当にfor-each構造を自分で書きたい場合は

、その後、このようなものは十分であろう:

var found1 = false; 
var items = $('#Root div.ListItem').toArray(); // an array of DOM elements 
for (var i = 0, j = items.length; i < j; i++) { 
    // You can access the DOM elements in the array by index, but you'll 
    // have to rewrap them in a jQuery object to be able to call .text() 
    if (group == $(items[i]).text()) { 
     found1 = true; 
     break; // no need to keep iterating once a match is found 
    } 
} 

$.grepを使用して、それが何かを発見したかどうかを確認することかもしれませんこれを行うには短いが、遅くなる方法:

var found1 = $.grep($('#Root div.ListItem'), function() { 
    return group == $(this).text(); 
}).length > 0; 

セレクタ要素のみ(例えば< 50)の一握りを返すされていない限り、私は後者をお勧めしません。

+0

jQueryコードとよく似ていますが、よく似ていません。しかし、私はグーグルで時間を過ごしました。私はそれが最良のコードだと思います。ありがとうございました。 – Max

+0

@Max:フィディングの例であなたの質問に編集を見ました。私はあなたの例とチェックアウトするためのあなたのフィドルのリビジョンに関する私の答えにいくつかの追加情報を追加しました。 –

3

何らかの条件を満たすと処理を停止するように思えます。あなたは条件が満たされたときfalseを返すことによってeachでそれを行うことができます:それは、他の配列がありますように(あなたがeachを使用していないと主張場合)また$('#Root div.ListItem')の戻り値を反復処理することができます

var found1 = false; 
$('#Root div.ListItem').each(function(index, d1) { 
    if (group == d1.text()) { 
     found1 = true; 
     return false; 
    } 
}); 

。あなたのフィドルにfor-inステートメントを使用する

2

私は必要な評判(50)がないので、私は受け入れられた答えにコメントできませんでした。しかし、私は期待通りに次のコードが動作することを信じていない:

for (var id in $('#root span').toArray()) { // convert to native array 
    // id is now an element found by the selector 
    $('<div />', {text: $(id).text()}).appendTo($('#out')); 
} 

私は何かが欠けていない限り、「ID」は、反復配列のインデックスを表す整数ではなく、実際の配列要素になります。その場合、$(id)は有効なjqueryオブジェクトを指しません。代わりに、このようなものにする必要はありませんか?

for (var id in $('#root span').toArray()) { // convert to native array 
    // id is now an element found by the selector 
    $('<div />', {text: $($('#root span')[id]).text()}).appendTo($('#out')); 
} 
関連する問題