Come scorrere le chiavi e i valori in un oggetto in CoffeeScript?


190

Ho un oggetto (un "array associato" per così dire - noto anche come un semplice oggetto JavaScript):

obj = {}
obj["Foo"] = "Bar"
obj["bar"] = "Foo"

Voglio iterare objusando CoffeeScript come segue:

# CS
for elem in obj

bu il codice CS sopra viene compilato in JS:

// JS
for (i = 0, len = obj.length; i < len; i++)

che non è appropriato in questo caso.


Il modo JavaScript sarebbe for(var key in obj)ma ora mi chiedo: come posso farlo in CoffeeScript?


4
Gli "array" in JavaScript / CoffeeScript sono oggetti speciali con indici numerici e una lengthproprietà che si riferisce semplicemente all'indice numerico più alto (più 1). Ciò che si vuole è solo un "oggetto": obj = {}. Le matrici sono oggetti, ma non c'è motivo di usarne uno nel tuo esempio.
Trevor Burnham,

1
Buon punto Trevor! Ho modificato la domanda per renderla un po 'meno fuorviante / confusa al riguardo.
Per Lundberg,

Risposte:


351

Usa for x,y of L. Documentazione pertinente .

ages = {}
ages["jim"] = 12
ages["john"] = 7

for k,v of ages
  console.log k + " is " + v

Uscite

jim is 12
john is 7

Puoi anche considerare la variante for own k,v of agesmenzionata da Aaron Dufour nei commenti. Questo aggiunge un segno di spunta per escludere le proprietà ereditate dal prototipo, che probabilmente non è un problema in questo esempio, ma potrebbe esserlo se si sta costruendo sopra altre cose.


12
Precisamente. CoffeeScript viene ofcompilato in JavaScript in. È un punto comune di confusione, ma l' inutilizzo per gli array è incredibilmente utile. Ne parlo a lungo nel libro CoffeeScript .
Trevor Burnham,

3
Non dovresti inizializzare arrcome arr = [], dovresti usare arr = {}. In Javascript (e Coffeescript) le matrici hanno indici numerici. Gli oggetti si comportano come array / dicts associativi.
Morgan Harris,

Grazie, questo è già stato sottolineato da Trevor e altri, e la mia risposta è stata quella di mantenere il codice della domanda originale. Aggiornerò comunque il mio esempio per usare un semplice oggetto per chiarezza.
Nick

13
Anche se non importa per questo esempio particolare, sembra che for own key, value of objsia più vicino a ciò che OP sta cercando.
Aaron Dufour,

4

Stai inizializzando un array, ma poi lo stai usando come un oggetto (non c'è "array associativo" in js).

Usa la sintassi per iterare sugli oggetti (qualcosa del genere):

for key, val of arr
  console.log key + ': ' + val 

3
In realtà, tutti gli oggetti in JS sono array associativi (senza ordinamento delle chiavi coerente). Quindi il codice fornito da jcmoney dovrebbe funzionare, anche se non c'è motivo di usarlo []invece {}che in quel caso.
Trevor Burnham,

jashkenas.github.com/coffee-script/#loops sembra che il ciclo generato da coffeescript non esegua l'iterazione sui membri oggetto.
Kioopi,

3

La versione abbreviata che utilizza la comprensione dell'array, che può essere utilizzata come loop a una riga.

console.log index + ": " + elm for index, elm of array

La comprensione dell'array è:

"Le comprensioni sostituiscono (e compilano) per i loop, con clausole di protezione opzionali e il valore dell'indice di array corrente. A differenza dei loop, le comprensioni di array sono espressioni e possono essere restituite e assegnate.", Http://coffeescript.org/ #loops


5
Spiega per favore. semplicemente fornire uno snippet di codice non è sufficiente. StackOverflow non è un sito "dammi il codice", l'idea è che altri trarranno maggiori benefici se la risposta fornirà un chiarimento del concetto astratto.
Eliran Malka,

1

con la tua convenzione, arr è un array, ma "pippo" è una proprietà di questo array, non è un valore indicizzato. Se vuoi archiviare i tuoi dati con i valori indicizzati di un array, dovresti aver scritto:

arr1 = []
arr1[0] = "Bar"
arr1[1] = "Foo"

o se vuoi un array associativo, usa semplicemente un oggetto:

arr2 = {}
arr2["Foo"] = "Bar" // equivalent to arr2.foo="Bar"
arr2["bar"] = "Foo" // equivalent to arr2.bar="Foo"

se vuoi passare sopra arr1:

str = "values are : "
for val in arr2
  str += val + " |"
console.log key + ': ' + val

ritorna :

values are : Bar | Foo |

e per scorrere su arr2: "per valore in array"

for key, val of arr
  console.log key + ': ' + val

che ritorna:

Foo : Bar
Bar : Foo
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.