2012-05-11 8 views
0

for..inループを使用して変数内のオブジェクトを選択しようとしていますが、必要なLiオブジェクトが表示されません。for..inを使用してオブジェクトをループする

var mUlLi = $(mUl).find('>li');  //select all li's in main Ul 
var listLength = $(mUlLi).length; 
if(listLength >0){ 
    /*for(i=0;i <listLength; i++) { 
     console.log(mUlLi[i]); // works fine show the li objects 
    }*/ 
    for(var obj in mUlLi) { 
     console.log(obj); // show's diff objects 
    } 
} 

これはどのように修正できますか?

+0

jQueryオブジェクトにDOMオブジェクトは 'のために/ in'で反復することができるjQueryオブジェクトのプロパティはありません。 – jfriend00

+0

Mehは、後で投稿されただけでなく、ほとんどの時間OPが望んでいた答えを含んでいなかったので、常に受け入れられる回答を見るのがうれしいです。 Btw、@ user1184100、あなたは本当にニックネームを変更する必要があります。 – ThiefMaster

答えて

5

jQueryには同じことを行うeach()があります。

$(mUl).find('>li').each(function(){ //for each of the elements found 
    console.log(this);    //in here, "this" is the DOM element <li> 
}); 

あなたはjQueryオブジェクトにfor inを使用した場合、あなたはまた、jQueryのメソッドとプロパティをループすることでしょう。しかし

、あなたは本当にあなたがそのjQueryの(あなたがeach()を使いたくなかったので)、その後、直接それを行うから得た要素のforループ行いたい場合:

var nodes = $(mUl).find('>li'), 
    nodesLength = nodes.length, 
    i, node; 

for(i=0,i<nodesLength;i++){ 
    node = nodes[i]; 
} 
+1

配列を最初に抽出する必要はありません - jQueryオブジェクトは '[] 'もサポートしています。 – ThiefMaster

2

あなたは、配列を反復処理するために適切な方法を使用することによってこの問題を解決することができます - あなたがここに欲しいものではありません - for(.. in ..)は、配列の要素/インデックスを反復処理のためではなく、オブジェクトのプロパティのためのものませです。

単に.each()を経由してjQueryの道を使用します。

mUlLi.each(function() { 
    console.log(this); 
}); 

あなたには、いくつかの理由(おそらくない正当な理由!)のためにこれをしたくない場合は、あなたも古き良きforループ使用することができます

for(var i = 0; i < listLength; i++) { 
    var elem = mUlLi[i]; 
    console.log(elem); 
} 
+0

お返事ありがとうございますが、私はeach()を使用したくありません – user1184100

+1

なぜですか?それがここに行く方法です。しかし、このケースの私の答えで2番目のコードブロックを見てください。 – ThiefMaster

+0

each()はfor..inより遅く、50個のdiff要素を持っています – user1184100

2

mUlLi(問題を変数名)は通常のオブジェクトではなく、jQueryコレクションです。 each()で繰り返すことができます。

mUlLi.each(function(){ 
    // `$(this)` is the current jQuery element 
}) 
関連する問題