2010-08-16 16 views
7
{"Journal"=>[[4, -785.0], 
      [13, -21.9165000915527], 
      [14, -213.008995056152], 
      [15, -50.074499130249]]} 

Comment pouvez-vous itérer ce hachage dans Ruby, et comment voulez-vous séparer les clés & valeurs?itération de la collection de hachage

+0

si vous devez itérer un hashmap, vous êtes peut-être en utilisant le mauvais conteneur – Scoregraphic

+0

@Scoregraphic - pas nécessairement - ce n'est pas si rare. Exemple: sérialisation des données. –

+0

Attendez, avez-vous un hachage avec une seule paire clé/valeur dont la valeur est un tableau de tableaux? – haffax

Répondre

14
myHash.each do |key, value| 
    // key holds the key, value holds the value 
end 

En cas veulent transformer les tableaux dans votre tableau à une carte faire:

myNewHash = {} 
myArrayOfArrays = myHash["Journal"] 
myArrayOfArrays.each do | item | 
    myNewHash[item[0]] = item[1] 
end 
21

Ruby a une interface d'itération uniforme. Toutes les collections dans Ruby ont une méthode appelée each, qui vous permet de parcourir chaque élément de la collection. Notez, cependant, que l'itération explicite est une odeur de code. Vous devez principalement utiliser des itérateurs de niveau supérieur tels que map, reduce, select, find, reject et autres.

Dans ce cas particulier où la collection est un Hash, chaque élément qui est donné à votre bloc, est un tableau à deux éléments comprenant la clé et la valeur:

print hsh.reduce('') {|s, el| 
    s << "The key is #{el.first} and the value is #{el.last}.\n" 
} 

Merci à la destructuration de Ruby bind, vous pouvez simplement lier les deux éléments du tableau à deux variables dans votre bloc et vous n'aurez pas la nécessité de prendre constamment le tableau à part:

print hsh.reduce('') {|s, (k, v)| 
    s << "The key is #{k} and the value is #{v}.\n" 
}