Eu tenho um objeto (um "array associado", por assim dizer - também conhecido como um objeto JavaScript simples):
obj = {}
obj["Foo"] = "Bar"
obj["bar"] = "Foo"
Quero iterar obj
usando o CoffeeScript da seguinte maneira:
# CS
for elem in obj
O código CS acima compila para JS:
// JS
for (i = 0, len = obj.length; i < len; i++)
o que não é apropriado neste caso.
A maneira JavaScript seria, for(var key in obj)
mas agora estou me perguntando: como posso fazer isso no CoffeeScript?
javascript
coffeescript
jhchen
fonte
fonte
length
propriedade que simplesmente se refere ao índice numérico mais alto (mais 1). O que você quer é apenas um "objeto":obj = {}
. Matrizes são objetos, mas não há razão para usar uma no seu exemplo.Respostas:
Use
for x,y of L
. Documentação relevante .Saídas
Você também pode considerar a variante
for own k,v of ages
mencionada por Aaron Dufour nos comentários. Isso adiciona uma verificação para excluir propriedades herdadas do protótipo, o que provavelmente não é um problema neste exemplo, mas pode ser se você estiver construindo sobre outras coisas.fonte
of
compila para JavaScriptin
. É um ponto comum de confusão, masin
usar com matrizes é incrivelmente útil. Eu falo sobre isso longamente no livro CoffeeScript .arr
comoarr = []
, você deve usararr = {}
. Em Javascript (e Coffeescript), as matrizes têm índices numéricos. Os objetos se comportam como matrizes / dictos associativos.for own key, value of obj
está mais próximo do que o OP está procurando.Você está inicializando uma matriz, mas depois a usa como um objeto (não há "matriz associativa" em js).
Use a sintaxe para iterar sobre objetos (algo como):
fonte
[]
vez disso{}
nesse caso.A versão curta usando compreensão de array, que pode ser usada como um loop de uma linha.
A compreensão da matriz é:
fonte
com sua convenção, arr é uma matriz, mas "foo" é uma propriedade dessa matriz, não é um valor indexado. Se você deseja armazenar seus dados com os valores indexados de uma matriz, você deve ter escrito:
ou se você deseja uma matriz associativa, basta usar um objeto:
se você quiser passar por arr1:
retorna:
e fazer um loop sobre arr2: "para valor na matriz"
que retorna:
fonte