Bagaimana cara mengulangi kunci dan nilai dalam suatu objek di CoffeeScript?

190

Saya punya objek ("associate array", misalnya - juga dikenal sebagai objek JavaScript biasa):

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

Saya ingin beralih objmenggunakan CoffeeScript sebagai berikut:

# CS
for elem in obj

bu kode CS di atas mengkompilasi ke JS:

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

yang tidak sesuai dalam kasus ini.


Cara JavaScript akan for(var key in obj)tetapi sekarang saya bertanya-tanya: bagaimana saya bisa melakukan ini dalam CoffeeScript?

jhchen
sumber
4
"Array" dalam JavaScript / CoffeeScript adalah objek khusus dengan indeks numerik dan lengthproperti yang hanya mengacu pada indeks numerik tertinggi (ditambah 1). Apa yang Anda inginkan adalah hanya sebuah "objek": obj = {}. Array adalah objek, tetapi tidak ada alasan untuk menggunakannya dalam contoh Anda.
Trevor Burnham
1
Poin bagus, Trevor! Saya telah memodifikasi pertanyaan menjadi sedikit kurang menyesatkan / membingungkan dalam hal ini.
Per Lundberg

Jawaban:

351

Gunakan for x,y of L. Dokumentasi yang relevan .

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

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

Keluaran

jim is 12
john is 7

Anda mungkin juga ingin mempertimbangkan varian for own k,v of agesseperti yang disebutkan oleh Aaron Dufour dalam komentar. Ini menambahkan tanda centang untuk mengecualikan properti yang diwarisi dari prototipe, yang mungkin tidak menjadi masalah dalam contoh ini tetapi mungkin jika Anda membangun di atas hal-hal lain.

Nick
sumber
12
Tepat. Kompilasi CoffeeScript ofuntuk JavaScript in. Ini adalah titik kebingungan yang umum, tetapi inmenggunakan array sangat berguna. Saya membicarakan hal ini secara panjang lebar dalam buku CoffeeScript .
Trevor Burnham
3
Anda tidak boleh menginisialisasi arrsebagai arr = [], Anda harus menggunakan arr = {}. Dalam array Javascript (dan Coffeescript) memiliki indeks numerik. Objek berperilaku seperti array / dikte asosiatif.
Morgan Harris
Terima kasih, itu sudah ditunjukkan oleh Trevor dan yang lainnya, dan jawaban saya sesuai dengan kode pertanyaan asli. Saya akan memperbarui contoh saya untuk menggunakan objek biasa untuk kejelasan.
Nick
13
Meskipun tidak masalah untuk contoh khusus ini, sepertinya for own key, value of objlebih dekat dengan apa yang dicari OP.
Aaron Dufour
4

Anda menginisialisasi array, tetapi kemudian Anda menggunakannya seperti objek (tidak ada "array asosiatif" di js).

Gunakan sintaks untuk beralih pada objek (seperti):

for key, val of arr
  console.log key + ': ' + val 
kioopi
sumber
3
Sebenarnya, semua objek di JS adalah array asosiatif (tanpa urutan kunci konsisten). Jadi kode yang diberikan jcmoney harus berfungsi, meskipun tidak ada alasan untuk digunakan []alih-alih {}dalam kasus itu.
Trevor Burnham
jashkenas.github.com/coffee-script/#loops sepertinya loop yang dihasilkan oleh coffeescript tidak akan beralih pada objek-anggota.
kioopi
3

Versi tangan pendek menggunakan pemahaman array, yang dapat digunakan sebagai loop satu baris.

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

Pemahaman array adalah:

"Pemahaman menggantikan (dan mengkompilasi ke dalam) untuk loop, dengan klausa penjaga opsional dan nilai indeks array saat ini. Tidak seperti untuk loop, pemahaman array adalah ekspresi, dan dapat dikembalikan dan ditugaskan.", Http://coffeescript.org/ #loops

sqren
sumber
5
tolong jelaskan. hanya memberikan cuplikan kode tidak cukup. stackoverflow bukan situs "beri kode", idenya adalah orang lain akan mendapat manfaat lebih jika jawabannya memberikan klarifikasi konsep abstrak.
Eliran Malka
1

dengan konvensi Anda, arr adalah array, tetapi "foo" adalah properti dari array ini, ini bukan nilai yang diindeks. Jika Anda ingin menyimpan data Anda nilai yang diindeks dari sebuah array, Anda harus menulis:

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

atau jika Anda menginginkan array asosiatif, cukup gunakan objek:

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

jika Anda ingin mengulangi arr1:

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

pengembalian:

values are : Bar | Foo |

dan untuk mengulangi arr2: "untuk nilai dalam array"

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

yang mengembalikan:

Foo : Bar
Bar : Foo
Benibur
sumber