Ruby Hash au tableau de valeurs

118

J'ai ceci:

hash  = { "a"=>["a", "b", "c"], "b"=>["b", "c"] } 

et je veux arriver à ceci: [["a","b","c"],["b","c"]]

Cela semble devoir fonctionner, mais cela ne fonctionne pas:

hash.each{|key,value| value}
=> {"a"=>["a", "b", "c"], "b"=>["b", "c"]} 

Aucune suggestion?

tbrooke
la source
Les réponses ci-dessous sont correctes ( hash.valuesétant la meilleure OMI). Mais je voulais souligner que lorsque vous fournissez un bloc, Hash#eachil renverra simplement la valeur complète du hachage. Si vous souhaitez effectuer une opération sur chaque élément et le renvoyer sous forme de tableau, utilisez Hash#collectou son alias Hash#map. Plus de trucs sur Enumerables ici .
brymck
3
Cette question semble étrangement familière ... Je me demande combien de personnes travaillent actuellement sur le même devoir.
Peter Brown

Réponses:

261

Aussi, un peu plus simple ...

>> hash = { "a"=>["a", "b", "c"], "b"=>["b", "c"] }
=> {"a"=>["a", "b", "c"], "b"=>["b", "c"]}
>> hash.values
=> [["a", "b", "c"], ["b", "c"]]

Ruby doc ici

Ray Toal
la source
3
+! Chouette! Je vais voter malgré une réponse concurrente (en utilisant map), car j'aime beaucoup ça!
Michael Durrant
2
Hash#valuesest non seulement plus simple, mais plus efficace. Comparer time ruby -e '(1..1000000).reduce({}){|h,i| h.store i,i; h}.values'avectime ruby -e '(1..1000000).reduce({}){|h,i| h.store i,i; h}.map{|k,v| v}'
jordanbtucker
+1 (Ébloui étonnamment après avoir essayé votre code) J'ai passé une journée sans succès à supprimer l'index en utilisant de nombreuses méthodes ... Tout ce que je peux dire, merci beaucoup !!! : D
Romains 8,38-39
2
Les touches sont-elles imprimées dans l'ordre exact où elles apparaissent?
stack1
43

J'utiliserais:

hash.map { |key, value| value }
Michael Durrant
la source
3
Je ne l'ai pas contre-voté, mais c'est un équivalent plus compliqué de Hash#values.
Mark Thomas
1
Oui, j'ai également voté pour la réponse de Ray. Je suis heureux de voter pour une réponse concurrente quand je l'aime aussi.
Michael Durrant
3
Je pense que nous ne sommes pas en compétition ici mais que nous nous entraidons, non? :)
witkacy26
Exactement ce que je recherchais en essayant de créer un tableau à partir d'un hachage en utilisant ses clés comme valeurs. Merci :)
Fabian Leutgeb
Utile lorsque vous devez également faire de la logique avec les touches en même temps.
Chris Cirefice
23
hash.collect { |k, v| v }
#returns [["a", "b", "c"], ["b", "c"]] 

Enumerable#collectprend un bloc et retourne un tableau des résultats de l'exécution du bloc une fois sur chaque élément de l'énumérable. Donc, ce code ignore simplement les clés et renvoie un tableau de toutes les valeurs.

Le Enumerablemodule est assez génial. Le savoir bien peut vous faire gagner beaucoup de temps et beaucoup de code.

Jergason
la source
2
N'oubliez pas que, comme la réponse de @Ray Toal, hash.valuesest finalement la bonne réponse ici.
tadman
Ou hash.map(&:second):)
Jaap Haagmans
7
hash  = { :a => ["a", "b", "c"], :b => ["b", "c"] }
hash.values #=> [["a","b","c"],["b","c"]]
mrded
la source
stackoverflow.com/posts/12771873/revisions car vous pouvez voir que la mise en forme de votre code était bien différente
karlingen
4

C'est aussi simple que

hash.values
#=> [["a", "b", "c"], ["b", "c"]]

cela renverra un nouveau tableau rempli avec les valeurs de hachage

si vous voulez stocker ce nouveau tableau, faites

array_of_values = hash.values
#=> [["a", "b", "c"], ["b", "c"]]

array_of_values
 #=> [["a", "b", "c"], ["b", "c"]]
Melissa Quintero
la source
2

Il y a aussi celui-ci:

hash = { foo: "bar", baz: "qux" }
hash.map(&:last) #=> ["bar", "qux"]

Pourquoi ça marche:

Les &appels to_procsur l'objet, et il passe comme un bloc à la méthode.

something {|i| i.foo }
something(&:foo)
Karlingen
la source
Une explication plus approfondie brianstorti.com/understanding-ruby-idiom-map-with-symbol
Sylvain