2010-07-05 16 views
9

Ho una pagina in cui sto cercando di recuperare array di classi per un sacco di div che condividono un comune classe. Per esempio:

<div class="common lorem ipsum"></div> 
<div class="common dolor sit"></div> 
<div class="common hello world"></div> 

voglio prendere ogni common div class e ottenere una matrice di esso è classi. Al momento, lo sto facendo utilizzando questo po 'di jQuery:

$('.common').each(function(index) { 
    var classes = $(this).attr('class').split(" "); 
    for(var i in classes) { 
    alert(classes[i]); 
    } 
}); 

Guardando il classes variabile prima risultante dà questo:

classes: Array (3) 
0: "common" 
1: "lorem" 
2: "ipsum" 
length: 3 
__proto__: Array 

Il problema è che il for(var i in classes) sembra essere l'iterazione oltre la matrice __proto__ e approfondire anche questo - qualcuno ha mai visto prima questo? Sto utilizzando l'ultima versione di Chrome (6.0.453.1).

risposta

16
for (var i = 0, l = classes.length; i<l; ++i) { 
alert(classes[i]); 
} 

Iterate attraverso una matrice con un normale per ciclo, non un for...in altrimenti enumera tramite le proprietà della matrice (in quanto la sua ancora un oggetto e ha altre proprietà, oltre agli elementi all'interno).

+2

+1 grattacapi Evita :) http://stackoverflow.com/questions/3154215/what-are-the-most-common-causes-of-errors-in-javascript-and -come-risolverli/3154285 # 3154285 – galambalazs

+0

Si noti inoltre che per..in non è garantito l'accesso agli indici in ordine numerico (si veda [MDC] (https://developer.mozilla.org/en/Core_JavaScript_1. 5_Riferimento/Dichiarazioni/per ... in)) –

+0

true, fortunatamente non è un problema qui – galambalazs

2

@meder risposto alla tua domanda solo di destra, ho solo voluto aggiungere, che se l'ordine del enumerazione non è importante, si può sempre usare questa forma semplificata:

for (var i = classes.length; i--;) { 
    alert(classes[i]); 
} 

E 'più breve, e più veloce.

+1

Oppure se vuoi ancora più veloce, usa un ciclo while negativo. – Anders

+0

questa è un'altra riga di codice, per quasi ** nessun vantaggio **. Il vero problema qui è ** leggibilità **. Questa forma fa bene su ogni campo. – galambalazs

4

da aggiungere alle altre risposte valide, in quanto si sta già utilizzando jQuery, è possibile usufruire di jQuery.each:

$.each(classes, function (i, cls) { 
    alert(cls); 
}); 
0

Ho visto questo usato here.

Non sono sicuro di quale sia il controllo dello (i in this) contro le estensioni 0-n.

var thisp = arguments[1]; 
for (var i = 0, len = this.length; i < len; i++){ 
    if (i in this){ 
    fun.call(thisp, this[i], i, this); // fun(element,index,array) 
    } 
} 
+1

Il controllo "i in questo" è perché [gli array JavaScript sono sparsi] (http://stackoverflow.com/questions/1510778/are-javascript-arrays-sparse). Non è necessariamente vero che ogni numero intero da 0 a 'length' è in realtà un elemento dell'array. –

1

aggiunta alla risposta di Meder ...

C'è un modo di iterare su oggetti in modo sicuro senza essere infastidito dalle proprietà ereditate di un oggetto. hasOwnProperty() in soccorso:

for(var i in classes) { 
    if (classes.hasOwnProperty(i)) { 
    var safeValue = classes[i]; 
    } 
} 
Problemi correlati