web-dev-qa-db-fra.com

Comment changer les clés de hachage de `Symbol`s en` String`s?

J'utilise Ruby on Rails 3.2.2 et je voudrais "facilement"/"rapidement" changer les clés de hachage de Symbols à Strings. 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?

44
user12882

appelez simplement stringify_keys (ou stringify_keys!)

http://apidock.com/Rails/Hash/stringify_keys

63
Viktor Trón

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.

16
jdoe

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.

10
eli

stringify_keys à partir de Rails

http://api.rubyonrails.org/classes/Hash.html#method-i-stringify_keys

hash = { name: 'Rob', age: '28' }
hash.stringify_keys
# => { "name" => "Rob", "age" => "28" }
5
Ery

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"}
3
rik.vanmechelen
 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

2
abhas

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.

0
pguardiario