J'utilise Ruby on Rails 3.2.2 et je voudrais "facilement"/"rapidement" changer les clés de hachage de Symbol
s à String
s. C'est-à-dire de {:one => "Value 1", :two => "Value 2", ...}
à {"one" => "Value 1", "two" => "Value 2", ...}
.
Comment puis-je faire cela en utilisant moins de code que possible?
appelez simplement stringify_keys (ou stringify_keys!)
Utilisez les méthodes stringify_keys
/stringify_keys!
de la classe Hash
.
Vous pouvez également utiliser some_hash.with_indifferent_access
pour renvoyer une instance de hachage dans laquelle votre clé peut être spécifiée sous forme de symboles ou de chaînes sans différence.
stringify_keys
est agréable, mais disponible uniquement dans Rails . Voici comment je le ferais sur une seule ligne, avec aucune dépendance:
new_hash = Hash[your_hash.collect{|k,v| [k.to_s, v]}]
Cela fonctionne sur Ruby 1.8.7 et supérieur . Si vous travaillez avec Ruby 2.1, vous pouvez faire:
new_hash = a.collect{|k,v| [k.to_s, v]}.to_h
Notez que cette solution n'est pas récursive et qu'elle ne gérera pas les clés "en double" correctement. par exemple. si vous avez :key
et aussi "key"
comme clés dans votre hachage, le dernier aura la priorité et écrasera le premier.
http://api.rubyonrails.org/classes/Hash.html#method-i-stringify_keys
hash = { name: 'Rob', age: '28' }
hash.stringify_keys
# => { "name" => "Rob", "age" => "28" }
il y a une belle bibliothèque qui fait l'affaire, la bibliothèque est "facets/hash/rekey" et la méthode est rekey !. Voir mon exemple ci-dessous sur la façon de l'utiliser. C'est juste une copie de
> require 'facets/hash/rekey'
=> true
> a = {:one => "Value 1", :two => "Value 2"}
=> {:one=>"Value 1", :two=>"Value 2"}
> a.rekey!(&:to_s)
=> {"one"=>"Value 1", "two"=>"Value 2"}
> a
=> {"one"=>"Value 1", "two"=>"Value 2"}
new_hash = Hash.new
your_hash.each{ |k,v| new_hash[k.to_s] = v }
new_hash sera identique à your_hash mais avec des clés de chaîne
Je suis venu ici pour voir s'il y avait quelque chose de mieux que:
JSON.parse(hash.to_json)
Mais je pense que je vais rester avec ce que j'ai.