web-dev-qa-db-ja.com

ハッシュキーを `Symbol`sから` String`sに変更するには?

私はRuby on Rails 3.2.2を使用しており、ハッシュキーをSymbolsから「簡単に」/「迅速に」変更したいStrings。つまり、{:one => "Value 1", :two => "Value 2", ...}から{"one" => "Value 1", "two" => "Value 2", ...}

可能な限り少ないコードを使用してそれを行うにはどうすればよいですか?

47
user12882

単にstringify_keys(またはstringify_keys!)を呼び出します

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

68
Viktor Trón

Hashクラスのstringify_keys/stringify_keys!メソッドを使用します。

some_hash.with_indifferent_accessを使用してHashインスタンスを返すこともできます。この場合、キーはシンボルまたは文字列として違いなく指定できます。

16
jdoe

stringify_keysはいいですが、Railsでのみ利用可能です。依存関係をゼロにして、1行でそれを行う方法を次に示します。

new_hash = Hash[your_hash.collect{|k,v| [k.to_s, v]}]

これはRuby 1.8.7以降で動作します。 Ruby 2.1を使用している場合、次のことができます。

new_hash = a.collect{|k,v| [k.to_s, v]}.to_h

このソリューションは再帰的ではなく、「重複」キーを適切に処理しないことに注意してください。例えば。ハッシュにキーとして:key"key"がある場合、最後のキーが優先され、最初のキーが上書きされます。

11
eli

railsのstringify_keys

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

トリックを行う素敵なライブラリがあります。ライブラリは「facets/hash/rekey」であり、メソッドはrekey!です。以下の使用方法の例をご覧ください。それはただのコピーです

> 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はyour_hashと同じですが、文字列キーを使用します

2
abhas

キーをシンボルから文字列に明示的に転送できます。
hash = hash.map { |k, v| [k.to_s, v] }.to_h

0
kjian

ここに来て、次のものよりも良いものがあるかどうかを確認しました。

JSON.parse(hash.to_json)

しかし、私は私が持っているものに固執すると思います。

0
pguardiario

hash = hash.transform_keys(&:to_s)は、すべてのキーをシンボルから文字列に変換します。

詳細: https://Ruby-doc.org/core-2.6.3/Hash.html#method-i-transform_keys

これはRuby 2.5: https://bugs.Ruby-lang.org/issues/1358 に追加されました

0
mooreds