2011-08-25 12 views
5

Sono in qualche modo confuso:per (... in ...) che non funziona con serie

Ho una lista di comandi come questo:

var commands = [{"command": "read"}, {"command": "write"}, {"command": "login"}]; 

Se provo l'accesso uno dei comandi come questo funziona:

console.log(commands[0]["command"]); // Output is "read" 
console.log(commands[0].command); // Output is "read" 

Ma se provo questo l'uscita è sempre definito:

for(command in commands) 
    console.log(command["command"]); // undefined, undefined, undefined 
+0

Se i comandi variabile è json, si potrebbe anche fare questo http://jsfiddle.net/aMTTU/ –

+3

Nonostante alcune delle risposte qui sotto, non 'for-in' una matrice. È lo strumento sbagliato per il lavoro in JavaScript. Un ciclo 'for' o il metodo' forEach' assicura solo indici numerici in un ordine garantito e non blocca la possibilità di estendere 'Array.prototype' se si sceglie. – user113716

risposta

2

Perché utilizzare for..in con un array? Basta accedere per indice, e anche di evitare potenziali problemi di estensioni prototipo (vedi hasOwnProperty)

var i,len=commands.length; 

for (i=0;i<len;i++) { 
    console.log commands[i].command 
} 

Se l'ordine non importa, in modo più conciso

for (i=commands.length-1;i>=0;i--) { 

} 

O

var i=commands.length; 
while (i--) { 
    ... 
} 
2

usare in questo modo

for(var x in commands) 
     console.log(commands[x].command); 
6

for fa un'iterazione array in javascript, così si vuole:

for(command in commands) 
    console.log(commands[command]["command"]); 

cioè, la variabile command nel tuo esempio è un indice di array, non l'elemento enumerato dall'array.

+0

Aggiunta: è possibile utilizzare in stile funzionale perEach/every/any =) – slezica

+0

@Santiago - Non ho idea di cosa intendi, cura di elaborare? – Jamiec

+0

Nono, la tua risposta è perfetta! Stavo affrontando l'OP. Per il comportamento che vuole, può usare forEach. – slezica

1

Hai provato:

for(command in commands[0]) { 
    console.log(command["command"]); 
} 
+0

Questo non funzionerà perché 'commands [0] .command' è il' "read" 'string, quindi' commands [0]. Com comando ["comando"] 'ti darà' undefined'. – user113716

5

I for ... in itera costrutto sopra il chiavi degli oggetti nella matrice, non gli oggetti stessi. Così si avrebbe bisogno di scrivere:

for(index in commands) 
    console.log(commands[index]["command"]); 
+1

+1 per aver menzionato * chiavi *. –

2

Il for (.. in ..) costrutto è per ciclare su oggetti, non array. Dal momento che si dispone di un array di oggetti, si dovrebbe fare:

for (var i = 0, j = commands.length; i < j; i += 1) { 
    console.log(commands[i].command); 
} 

Per una spiegazione approfondita sul motivo per cui si dovrebbe usare questo for costrutto al posto del for...in, vedere answer #3010848.

+0

Ma l'OP sta creando un oggetto e non un array ... –

+1

Uh, no, ha chiaramente definito una serie di oggetti che desidera ripetere: 'var commands = [{" command ":" read "}, {" command ":" write "}, {" command ":" login "}];' –

+1

@Martin In realtà OP sta creando una serie di oggetti. La matrice è ciò che viene trasmesso attraverso il quale è più naturale come un ciclo 'for'. –

Problemi correlati