Je voudrais remplacer chacun value
dans un hachage par value.some_method
.
Par exemple, pour un hachage simple:
{"a" => "b", "c" => "d"}`
chaque valeur doit être .upcase
d, donc cela ressemble à:
{"a" => "B", "c" => "D"}
J'ai essayé #collect
et #map
mais toujours juste récupérer des tableaux. Y a-t-il une manière élégante de faire cela?
METTRE À JOUR
Merde, j'ai oublié: le hachage est dans une variable d'instance qui ne devrait 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, puis boucler sur le hachage en le remplissant. Quelque chose comme:
new_hash = hash.magic{ ... }
Réponses:
ou, si vous préférez le faire de manière non destructive, et renvoyer un nouveau hachage au lieu de modifier
my_hash
:Cette dernière version a l'avantage supplémentaire de pouvoir également transformer les clés.
la source
each_with_object
est une version plus pratique deinject
quand vous ne voulez pas terminer le bloc avec le hachage:my_hash.each_with_object({}) {|(k, v), h| h[k] = v.upcase }
a_new_hash = Hash[ my_hash.map { |k, v| [k, v.upcase] } ]
.to_h
Puisque
ruby 2.4.0
vous pouvez utiliser laHash#transform_values
méthode native :Il existe également une
Hash#transform_values!
version destructive .la source
Vous pouvez collecter les valeurs et les convertir à nouveau de Array en Hash.
Comme ça:
la source
Cela le fera:
Par opposition à
inject
l'avantage, vous n'avez pas besoin de renvoyer le hachage à l'intérieur du bloc.la source
Essayez cette fonction:
la source
Il existe une méthode pour cela dans ActiveSupport v4.2.0. Il est appelé
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.Mettre à jour:
Depuis Ruby 2.4.0, vous pouvez utiliser nativement
#transform_values
et#transform_values!
.la source
Vous pouvez aller plus loin et le faire sur un hachage imbriqué. Cela se produit certainement beaucoup avec les projets Rails.
Voici du code pour vous assurer qu'un hachage de paramètres est en UTF-8:
la source
Je fais quelque chose comme ça:
Cela vous offre également la possibilité de transformer la clé ou la valeur via n'importe quelle expression (et ce n'est pas destructif, bien sûr).
la source
Ruby a la
tap
méthode ( 1.8.7 , 1.9.3 et 2.1.0 ) qui est très utile pour des choses comme cela.la source
Spécifique aux rails
to_s
Si quelqu'un a seulement besoin d'appeler la méthode pour chacune des valeurs et n'utilise pas Rails 4.2 (qui inclut le lien detransform_values
méthode ), vous pouvez faire ce qui suit:Remarque: l'utilisation de la bibliothèque 'json' est requise.
Remarque 2: Cela transformera également les clés en chaînes
la source
Si vous savez que les valeurs sont des chaînes, vous pouvez appeler la méthode replace sur celles-ci pendant le cycle: de cette façon, vous changerez la valeur.
Altohugh cela est limité au cas où les valeurs sont des chaînes et ne répondent donc pas complètement à la question, j'ai pensé que cela pouvait être utile à quelqu'un.
la source
la source