Comment parcourir les clés et les valeurs d'un objet dans CoffeeScript?

190

J'ai un objet (un "tableau associé" pour ainsi dire - également appelé objet JavaScript brut):

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

Je veux répéter l' objutilisation de CoffeeScript comme suit:

# CS
for elem in obj

bu le code CS ci-dessus se compile en JS:

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

ce qui n'est pas approprié dans ce cas.


La manière JavaScript serait for(var key in obj)mais maintenant je me demande: comment puis-je faire cela dans CoffeeScript?

jhchen
la source
4
Les «tableaux» en JavaScript / CoffeeScript sont des objets spéciaux avec des indices numériques et une lengthpropriété qui fait simplement référence à l'index numérique le plus élevé (plus 1). Ce que vous voulez est juste un « objet »: obj = {}. Les tableaux sont des objets, mais il n'y a aucune raison d'en utiliser un dans votre exemple.
Trevor Burnham
1
Bon point Trevor! J'ai modifié la question pour qu'elle soit un peu moins trompeuse / déroutante à cet égard.
Par Lundberg

Réponses:

351

Utilisation for x,y of L . Documentation pertinente .

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

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

Les sorties

jim is 12
john is 7

Vous pouvez également envisager la variante for own k,v of agesmentionnée par Aaron Dufour dans les commentaires. Cela ajoute une vérification pour exclure les propriétés héritées du prototype, ce qui n'est probablement pas un problème dans cet exemple, mais peut-être si vous construisez sur d'autres éléments.

pseudo
la source
12
Précisément. CoffeeScript se ofcompile en JavaScript in. C'est un point commun de confusion, mais l' inutiliser avec des tableaux est incroyablement utile. J'en parle longuement dans le livre CoffeeScript .
Trevor Burnham
3
Vous ne devez pas initialiser arrcomme arr = [], vous devez utiliser arr = {}. En Javascript (et Coffeescript), les tableaux ont des indices numériques. Les objets se comportent comme des tableaux / dictionnaires associatifs.
Morgan Harris
Merci, cela a déjà été signalé par Trevor et d'autres, et ma réponse restait fidèle au code de la question d'origine. Je vais mettre à jour mon exemple pour utiliser un objet simple pour plus de clarté de toute façon.
Nick
13
Bien que cela n'ait pas d'importance pour cet exemple particulier, cela semble être for own key, value of objplus proche de ce que recherche OP.
Aaron Dufour le
4

Vous initialisez un tableau, mais ensuite vous l'utilisez comme un objet (il n'y a pas de "tableau associatif" dans js).

Utilisez la syntaxe pour itérer sur des objets (quelque chose comme):

for key, val of arr
  console.log key + ': ' + val 
kioopi
la source
3
En fait, tous les objets dans JS sont des tableaux associatifs (sans ordre de clé cohérent). Donc, le code donné par jcmoney devrait fonctionner, bien qu'il n'y ait aucune raison de l'utiliser à la []place de {}dans ce cas.
Trevor Burnham
jashkenas.github.com/coffee-script/#loops semble que la boucle générée par coffeescript n'itérera pas sur les membres de l'objet.
kioopi
3

La version courte utilisant la compréhension de tableau, qui peut être utilisée comme une boucle sur une ligne.

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

La compréhension des tableaux sont:

"Les compréhensions remplacent (et compilent dans) les boucles for, avec des clauses de garde optionnelles et la valeur de l'index de tableau actuel. Contrairement aux boucles for, les compréhensions de tableau sont des expressions, et peuvent être retournées et assignées.", Http://coffeescript.org/ #boucles

sqren
la source
5
S'il vous plaît, expliquez. il ne suffit pas de fournir un extrait de code. stackoverflow n'est pas un site "gimme the codez", l'idée est que d'autres en bénéficieront davantage si la réponse apporte une clarification du concept abstrait.
Eliran Malka
1

avec votre convention, arr est un tableau, mais "foo" est une propriété de ce tableau, ce n'est pas une valeur indexée. Si vous souhaitez stocker vos données les valeurs indexées d'un tableau, vous devez avoir écrit:

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

ou si vous voulez un tableau associatif, utilisez simplement un objet:

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

si vous voulez boucler sur arr1:

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

Retour :

values are : Bar | Foo |

et pour boucler sur arr2: "for value in array"

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

qui renvoie:

Foo : Bar
Bar : Foo
Benibur
la source