2013-04-06 11 views
5

Ho un array in questo modoforEach non funziona quando ciclo for fa con un array di oggetti

var updates = []; 

Poi aggiungo roba all'array simili

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

Quando chiamo le funzioni con un ciclo for funziona come previsto

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

Ma quando uso il forEach non funziona !?

updates.forEach(function (update) { 

    update(); 
}); 

forE sicuramente funziona nel mio browser che è google chrome, cosa sto facendo di sbagliato?

risposta

9

forEach itera su indexes non oltre properties. Il tuo codice:

updates["func1"] = "something"; 

Aggiunge una proprietà da un oggetto - che per inciso è un array - non un elemento di un array. In realtà, è pari a:

updates.func1 = "something"; 

Se avete bisogno di qualcosa come un HashMap, quindi è possibile utilizzare un oggetto normale invece:

updates = {}; 

updates["func1"] = "something"; 

E poi iterare utilizzando for…in, che shouldn't be used on arrays

Oppure è possibile utilizzare Object.keys per recuperare le proprietà su di esse: it.

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

Grazie per avermi aiutato a capirlo meglio, ho letto che non avrei dovuto usare 'for ... in', ecco perché ho fatto la domanda, quindi grazie per l'alternativa a' for ... in' :) – GriffLab

5

Non si aggiungono gli elementi all'array, si aggiungono le proprietà dell'oggetto all'array. for .. in restituirà tutte le proprietà, forEach solo itera su elementi di array.

Per aggiungere alla matrice, si dovrebbe fare questo:

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

Se avete intenzione di aggiungere nel modo in cui siete, allora basta usare un oggetto e non un array:

var updates = {} 

e quindi utilizzare for ... in.

Problemi correlati