2013-04-06 5 views
5

Mam tablicę jak takforEach nie działa, gdy dla pętli robi z tablicą obiektów

var updates = []; 

Następnie dodać rzeczy do tablicy jak to

updates["func1"] = function() { x += 5 }; 

Kiedy wywołanie funkcji z pętla for działa zgodnie z oczekiwaniami

for(var update in updates) { 
    updates[update](); 
} 

Ale kiedy używam forEacha, to nie działa !?

updates.forEach(function (update) { 

    update(); 
}); 

forEach zdecydowanie działa w mojej przeglądarce, która jest Google Chrome, co robię źle?

Odpowiedz

9

forEach iteruje nad indexes nie nad properties. Twój kod:

updates["func1"] = "something"; 

Dodaje właściwość do obiektu - który nawiasem mówiąc jest tablicą - nie jest elementem tablicy. W rzeczywistości, jest to równoznaczne z:

updates.func1 = "something"; 

Jeśli trzeba coś jak hashmap, a następnie można użyć zwykłego przedmiotu Zamiast:

updates = {}; 

updates["func1"] = "something"; 

A następnie iteracyjne użyciu for…in, że shouldn't be used on arrays

Lub można użyć Object.keys, aby pobrać właściwości iterate nad nimi:

Object.keys(updates).forEach(function(key) { 
    console.log(key); 
}); 
+0

Dziękuję to pomogło mi zrozumieć, że o wiele lepiej, czytałem, że nie powinna była zastosować 'dla ... in' dlatego zadałem pytanie, więc dzięki za alternatywę dla ...' in' :) – GriffLab

5

Nie dodajesz elementów do tablicy, dodajesz właściwości obiektu do obiektu tablicy. for .. in zwróci wszystkie właściwości, forEach tylko iteruje po elementach tablicy.

Aby dodać do tablicy, by to zrobić:

updates.push(function() { x += 5 }); 

Jeśli masz zamiar dodać w jaki jesteś, a potem po prostu korzystać z obiektu, a nie tablicy:

var updates = {} 

a następnie użyj for ... in.