138 votes

Comment modifier les valeurs de hachage ?

Je voudrais remplacer chaque value dans un hachage avec value.some_method .

Par exemple, pour un simple hachage :

{"a" => "b", "c" => "d"}` 

chaque valeur doit être .upcase d, donc ça ressemble à ça :

{"a" => "B", "c" => "D"}

J'ai essayé #collect y #map mais je n'ai toujours que des tableaux en retour. Existe-t-il un moyen élégant de procéder ?

UPDATE

Mince, j'oubliais : le hash est dans une variable d'instance qui ne doit pas être modifiée. J'ai besoin d'un nouveau hachage avec les valeurs modifiées, mais je préférerais ne pas définir cette variable explicitement et ensuite boucler sur le hachage en le remplissant. Quelque chose comme :

new_hash = hash.magic{ ... }

231voto

kch Points 25855
my_hash.each { |k, v| my_hash[k] = v.upcase } 

ou, si vous préférez le faire de manière non destructive, et renvoyer un nouveau hachage au lieu de modifier le fichier my_hash :

a_new_hash = my_hash.inject({}) { |h, (k, v)| h[k] = v.upcase; h } 

Cette dernière version présente l'avantage supplémentaire de pouvoir également transformer les clés.

115voto

potashin Points 37585

Depuis ruby 2.4.0 vous pouvez utiliser le système natif Hash#transform_values méthode :

hash = {"a" => "b", "c" => "d"}
new_hash = hash.transform_values(&:upcase)
# => {"a" => "B", "c" => "D"}

Il y a aussi des destructions Hash#transform_values! version.

35voto

Endel Points 301

Vous pouvez collecter les valeurs, et les convertir à nouveau de Array en Hash.

Comme ça :

config = Hash[ config.collect {|k,v| [k, v.upcase] } ]

24voto

platzhirsch Points 10662

Cela va le faire :

my_hash.each_with_object({}) { |(key, value), hash| hash[key] = value.upcase }

Par opposition à inject l'avantage est que vous n'avez pas besoin de renvoyer le hachage à l'intérieur du bloc.

12voto

Josua Schmid Points 541

Il existe une méthode pour cela dans ActiveSupport v4.2.0. Il s'appelle transform_values et exécute simplement un bloc pour chaque paire clé-valeur.

Puisqu'ils le font avec un each Je pense qu'il n'y a pas de meilleur moyen que de passer en boucle.

hash = {sample: 'gach'}

result = {}
hash.each do |key, value|
  result[key] = do_stuff(value)
end

Mise à jour :

Depuis Ruby 2.4.0, vous pouvez utiliser nativement #transform_values y #transform_values! .

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X