2011-06-20 20 views
178

mam obiektu (e „łączą układ”, znany także jako zwykły obiektu JavaScript):iteracyjnego obiektu w coffeescript

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

i muszę iteracyjnego niego przy coffeescript. Teraz, wykonując tak:

for elem in obj 

nie działa, ponieważ obj.length ma wartość 0, której używa kod kompilatora js. W zwykłym Javascriptu po prostu robiłbym

for(var key in obj) 

, ale teraz zastanawiam się: jak mogę to zrobić w coffeescript?

+4

"układy" w JavaScript/coffeescript są specjalne obiekty ze wskaźnikami liczbowymi i 'własności length' to po prostu odnosi się do najwyższego indeksu liczbowego (plus 1). To, czego chcesz, to tylko "obiekt": "obj = {}". Tablice są obiektami, ale nie ma powodu, aby używać ich w swoim przykładzie. –

+1

Dobry punkt Trevor! Zmodyfikowaliśmy to pytanie, aby było nieco mniej mylące/mylące pod tym względem. –

Odpowiedz

333

Korzystając for x,y of L. Relevant documentation.

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

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

Wyjścia

jim is 12 
john is 7 

Można również rozważyć wariant for own k,v of ages jak wspomniano Aaron Dufour w komentarzach. Dodaje to kontrolę, aby wykluczyć właściwości dziedziczone z prototypu, co prawdopodobnie nie jest problemem w tym przykładzie, ale może być, jeśli budujesz na podstawie innych rzeczy.

+12

Dokładnie. Kompilator CoffeeScript'a "z" kompiluje się do 'in' JavaScript. Jest to powszechna pomyłka, ale posiadanie 'in' do użycia z tablicami jest niezwykle użyteczne. Mówię o tym długo w [książce CoffeeScript] (http://pragprog.com/titles/tbcoffee/coffeescript). –

+3

Nie powinieneś inicjalizować 'arr' jako' arr = [] ', powinieneś użyć' arr = {} '. W tablicach JavaScript (i Coffeescript) są indeksy numeryczne. Obiekty zachowują się jak tablice asocjacyjne/dyktowane. –

+0

Dzięki, zauważyłem to już wcześniej przez Trevora i innych, a moją odpowiedzią było zachowanie oryginalnego kodu zapytania. Zaktualizuję mój przykład, aby mimo wszystko używać zwykłego obiektu dla jasności. – Nick

4

Inicjujesz tablicę, ale używasz jej jak obiektu (nie ma "asocjacyjnej tablicy" w js).

Użyj składni dla Iterowanie nad obiektami (coś podobnego):

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

W rzeczywistości * wszystkie * obiekty w JS są tablicami asocjacyjnymi (sans spójne porządkowanie klawiszy). Tak więc kod jcmoney powinien działać, ale nie ma powodu, aby używać '[]' zamiast '{}' w takim przypadku. –

+0

http://jashkenas.github.com/coffee-script/#loops wygląda na to, że pętla wygenerowana przez coffeescript nie będzie iterować nad obiektami. – kioopi

2

Wersja krótkiego układu wykorzystująca zrozumienie tablicy, która może być używana jako pętla jednoprzewodowa.

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

Array zrozumieniem to:.

„listowe wymienić (i skompilować w) dla pętli, z opcjonalnymi klauzul ochronnych oraz wartość aktualnego indeksu tablicy przeciwieństwie do pętli Ułatwienia tablicy są wyrażenia i może zostać zwrócony i przypisane. " http://coffeescript.org/#loops

+4

proszę wyjaśnić. samo podanie fragmentu kodu jest niewystarczające. stackoverflow nie jest witryną "gimme the codez", chodzi o to, że inni skorzystają więcej, jeśli odpowiedź zapewni wyjaśnienie abstrakcyjnej koncepcji. –

+2

"Czy mogę wytłumaczyć" – makdad

1

z konwencją, arr znajdował się w rray, ale "foo" jest właściwością tej tablicy, nie jest wartością indeksowaną. Jeśli chcesz zapisać swoje dane indeksowanych wartości tablicy, powinno być napisane:

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

lub jeśli chcesz tablicę asocjacyjną, wystarczy użyć obiektu:

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

jeśli chcesz do połączeń na ARR1:

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

zwrócone:

values are : Bar | Foo | 

i pętli nad ARR2: "dla wartości w tablicy"

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

która zwraca:

Foo : Bar 
Bar : Foo