2010-07-05 16 views
9

Mam stronę, na której próbuję pobrać tablice klas dla partycji div, które mają wspólne klasa. Na przykład:

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

Chcę sprowadzić Każda klasa common div i uzyskać tablicę To klas. W tej chwili robię to za pomocą tego trochę jQuery:

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

Patrząc na pierwszy wynikającej zmiennej classes daje to:

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

Problemem jest to, że wydaje się być for(var i in classes) Iteracja ponad __proto__ Array i zagłębianie się w to również - czy ktokolwiek kiedykolwiek natknął się na to wcześniej? Używam najnowszej wersji Chrome (6.0.453.1).

Odpowiedz

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

iterację tablicy z regularnie na pętli, nie for...in przeciwnym przypadku wylicza się przez właściwości tablicowych (od jej nieruchomego obiektu i ma inne właściwości dodatkowo do wewnątrz elementów).

+2

+1 Unikaj pułapek :) http://stackoverflow.com/questions/3154215/what-are-the-most-common-causes-of-errors-in-javascript-and -how-to-fix-them/3154285 # 3154285 – galambalazs

+0

Należy również zauważyć, że dla ... nie ma gwarancji dostępu do indeksów w kolejności numerycznej (zobacz [MDC] (https://developer.mozilla.org/en/Core_JavaScript_1. 5_Reference/Statement/for ... in)) –

+0

prawda, na szczęście to nie problem tutaj – galambalazs

2

@meder odpowiedział na swoje pytanie w porządku, ja tylko chciałem dodać, że jeśli kolejność wyliczenia nie jest ważne, zawsze można skorzystać z tej uproszczonej formy:

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

Jest krótsza, i szybciej.

+1

Lub jeśli chcesz jeszcze szybciej, użyj ujemnej pętli while. – Anders

+0

to jeszcze jedna linia kodu, prawie ** brak korzyści **. Prawdziwym problemem jest tutaj ** czytelność **. Ta forma działa dobrze na każdym polu. – galambalazs

4

Aby dodać do innych ważnych odpowiedzi, ponieważ jesteś już przy użyciu jQuery, można skorzystać z jQuery.each:

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

Widziałem to kiedyś here.

Nie jestem pewien, co (i in this) dwukrotnie sprawdzić przeciwko 0-n chwastów.

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

Kontrola "i w tym" polega na tym, że [tablice JavaScript są rzadkie] (http://stackoverflow.com/questions/1510778/are-javascript-arrays-sparse). Niekoniecznie prawdą jest, że każda liczba całkowita od 0 do "length" jest w rzeczywistości elementem tablicy. –

1

Dodawanie do odpowiedzi Meder za ...

Jest to sposób iteracji nad obiektami bezpiecznie bez denerwują odziedziczonych właściwości obiektu. hasOwnProperty() na ratunek:

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