CoffeeScript'teki bir nesnedeki anahtarlar ve değerler üzerinde yineleme nasıl yapılır?


190

Bir nesne (bir "ilişkilendirmek dizi" demek - düz JavaScript nesnesi olarak da bilinir) var:

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

objCoffeeScript kullanarak aşağıdaki gibi yineleme yapmak istiyorum :

# CS
for elem in obj

yukarıdaki CS kodu JS için derler:

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

bu da uygun değil.


JavaScript yolu olurdu for(var key in obj)ama şimdi merak ediyorum: bunu CoffeeScript'te nasıl yapabilirim?


4
JavaScript / CoffeeScript'teki "Diziler", sayısal indekslere sahip özel nesneler ve lengthyalnızca en yüksek sayısal dizine (artı 1) karşılık gelen bir özelliktir. Ne istediğiniz gibi bir "nesne" dir: obj = {}. Diziler nesnedir, ancak örneğinizde bir tane kullanmak için hiçbir neden yoktur.
Trevor Burnham

1
İyi nokta Trevor! Soruyu biraz daha az yanıltıcı / kafa karıştırıcı olacak şekilde değiştirdim.
Per Lundberg

Yanıtlar:


351

Kullanın for x,y of L. İlgili belgeler .

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

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

çıktılar

jim is 12
john is 7

for own k,v of agesYorumlarda Aaron Dufour'un belirttiği varyantı da düşünmek isteyebilirsiniz . Bu, prototipten miras alınan özellikleri hariç tutmak için bir kontrol ekler; bu, muhtemelen bu örnekte bir sorun değildir, ancak başka şeylerin üzerine inşa ediyorsanız olabilir.


12
Tam. CoffeeScript'ler ofJavaScript'leri derler in. Bu yaygın bir karışıklık noktasıdır, ancak indizilerle birlikte kullanmak son derece yararlıdır. Bunun hakkında CoffeeScript kitabında uzun süredir konuşuyorum .
Trevor Burnham

3
İnitialise Sen olmamalıdır arrolarak arr = [], kullanmak gerekir arr = {}. Javascript (ve Coffeescript) dizilerinde sayısal indeksler bulunur. Nesneler ilişkilendirilebilir diziler / diktüler gibi davranırlar.
Morgan Harris

Teşekkürler, bu zaten Trevor ve diğerleri tarafından işaret edildi ve cevabım orijinal soru kodunu koruyordu. Zaten netlik için düz bir nesne kullanmak üzere örneğimi güncelleyeceğim.
Nick

13
Bu özel örnek için önemli olmasa da, for own key, value of objOP'nin aradığı şeye daha yakın gibi görünüyor.
Aaron Dufour

4

Bir diziyi başlatıyorsunuz, ancak bir nesne gibi kullanıyorsunuz (js'de "ilişkisel dizi" yok).

Nesneler üzerinde yineleme yapmak için sözdizimini kullanın (şuna benzer):

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

3
Aslında, JS'deki tüm nesneler ilişkisel dizilerdir (sans tutarlı anahtar sıralaması). Kod jcmoney kullanmak için hiçbir neden yok olsa çalışması gerekir verdi Yani []yerine {}bu durumda.
Trevor Burnham

jashkenas.github.com/coffee-script/#loops , coffeescript tarafından oluşturulan döngü nesne üyeleri üzerinde yinelenmeyecek gibi görünüyor.
kioopi

3

Tek satırlık döngü olarak kullanılabilen dizi kavrama özelliğini kullanan kısa el versiyonu.

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

Diziyi anlama:

"Anlaşmalar, döngüler için isteğe bağlı koruma yan tümceleri ve geçerli dizi dizininin değeriyle değiştirilir (ve derlenir). Döngülerden farklı olarak, dizi anlaşmaları ifadelerdir ve döndürülebilir ve atanabilir.", Http://coffeescript.org/ #loops


5
lütfen açıkla. yalnızca bir kod pasajı sağlamak yeterli değildir. stackoverflow bir "gimme codez" sitesi değil, fikir, cevap soyut kavramın açıklamasını sağlarsa başkalarının daha fazla fayda sağlayacağıdır.
Eliran Malka

1

kuralınızla birlikte, arr bir dizidir, ancak "foo" bu dizinin bir özelliğidir, dizine alınmış bir değer değildir. Verilerinizi bir dizinin dizine alınan değerlerini saklamak istiyorsanız, şunu yazmış olmalısınız:

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

veya ilişkilendirilebilir bir dizi istiyorsanız, yalnızca bir nesne kullanın:

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

arr1 üzerinde döngü yapmak istiyorsanız:

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

İadeler :

values are : Bar | Foo |

ve arr2 üzerinde döngü: "dizideki değer için"

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

döndüren:

Foo : Bar
Bar : Foo
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.