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?


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


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 }

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.


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


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"]]

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.