2011-09-24 10 views
5

Tworzę system listy odtwarzania, gdzie każdy utwór ma unikalny identyfikator. Po dodaniu utworu do tablicy listy odtwarzania jego indeks jest rejestrowany jako jego identyfikator.Jak iterować obiekt w javascript z nieuporządkowanym indeksem

Zwykle podczas zapętlania tablicy javascript pobiera się długość i liczy się indeks. Czy istnieje sposób na przechodzenie przez tablicę z nieużywanymi indeksami? Czy to zła praktyka z jakiegokolwiek powodu?

+0

Wszystkie tablice javascript są asocjacyjne, nie trzeba używać indeksu zliczającego. – Perception

+0

@Perception: Nonsens. JavaScript 'Array's mają sekwencyjne, numeryczne indeksy. Być może odnosisz się do bardziej ogólnych obiektów. Częsty błąd. –

+0

@Percepcja Naprawdę nie ma czegoś takiego jak Tablica lub Tablica asocjacyjna. Wszystkie obiekty są praktycznie hashtables. obiekt Array w Javascript ma tylko kilka metod działania jak tablica na zewnątrz. – Jonathan

Odpowiedz

5
var obj = {"123": "Lalala", 
      "456": "dum dum"}; 
for(var i in obj){ 
    //i = ID 
    // obj[i] = "song" 
} 

Użyj for(var i in obj), aby przechodzić między obiektami. Zobacz komentarze powyżej, aby zrozumieć znaczenie tego for -zmiany.

Mówisz o obiektach, a nie tablice, na drodze:

var array = [7, 5, 9]; 

Tablica może być symulowane w ten sposób, tak że for(var i=0; i<array_like.length; i++) mogą być użyte. Funkcje Array (takie jak pop) nie mogą być stosowane na nich, chyba że go określić:

var array_like = {0:7, 1:5, 2:9, length:3}; 
+0

Wielkie dzięki. Dla ... wygląda jak moje rozwiązanie. Dziękuję również za poprawienie mnie. –

+0

To nie ma znaczenia w tym przypadku, ale nie zapomnij sprawdzić hasOwnProperty w ogólnym podejściu do używania dla ... w –

-1

Zakładając, że tablica jest w formie:

array['id1'] = 'val1'; 
array['id2'] = 'val2'; 
array['id3'] = 'val3'; 

Można iteracyjne nad wartościami za pomocą:

for (var id in array) { 
    document.write(id + ' – ' + array[id]); 
} 
+0

To nie może być tablica, ale obiekt. –

4

Możesz uzyskać dostęp do właściwości obiektu na jeden z dwóch sposobów. Albo używając "." takich jak:

var my prop = obj.property; 

Albo poprzez notacji wspornika:

var my prop = obj["property"]; 

Teraz, to naprawdę nie ma odpowiedzi na Twoje pytanie. Tak więc, oto kilka sposobów:

Wykorzystać każdą funkcję jQuery:

$.each(obj, function(key, value){ 
    //Do something with your key and value. 
}); 

Wykorzystaj Javascript dla funkcji:

for(var key in obj) 
{ 
    var value = obj[key]; 
    //Do something with your key and value. 
} 

nadzieję, że pomoże!

+0

Dzięki. Dla ... wydaje się, że to jest najlepsza droga. Jedna rzecz jednak: używanie $ .each z jquery zachowuje się w taki sam sposób, jak w przypadku zwykłej pętli for, ponieważ zaczyna się od 0 i zlicza na całej długości. –

0

można też zrobić tak 'dla każdego' iteracyjne nad właściwości tylko wartości:

var obj = { "klucz1": "val1", "Klawisz2": "val2"};

dla każdej wartości (VaR obj) { .... }

Ale w tym przypadku nie są w stanie uzyskać dostęp do nazwy właściwości.

+0

-1 dla niepoprawnego słowa kluczowego - wystarczy, że nie ma "każdego". –

+0

Istnieją dwa typy dla: "dla" - iteruje indeksy, a "dla każdego" - iteruje wartości. Ale "dla każdego" nie jest obsługiwane w starej wersji IE. Jak myślisz, dlaczego to nieprawidłowe słowo kluczowe? – timestopper

+0

'for each' jest specyficznym dla Mozilli rozszerzeniem tego języka i zapewnia niewielką lub zerową przewagę nad standardową składnią' for ... in' dostępną w ECMA i wszystkich obecnych silnikach JS. –