私はRuby on Rails 3.2.2を使用しており、ハッシュキーをSymbol
sから「簡単に」/「迅速に」変更したいString
s。つまり、{:one => "Value 1", :two => "Value 2", ...}
から{"one" => "Value 1", "two" => "Value 2", ...}
。
可能な限り少ないコードを使用してそれを行うにはどうすればよいですか?
単にstringify_keys
(またはstringify_keys!
)を呼び出します
Hash
クラスのstringify_keys
/stringify_keys!
メソッドを使用します。
some_hash.with_indifferent_access
を使用してHashインスタンスを返すこともできます。この場合、キーはシンボルまたは文字列として違いなく指定できます。
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"
がある場合、最後のキーが優先され、最初のキーが上書きされます。
http://api.rubyonrails.org/classes/Hash.html#method-i-stringify_keys
hash = { name: 'Rob', age: '28' }
hash.stringify_keys
# => { "name" => "Rob", "age" => "28" }
トリックを行う素敵なライブラリがあります。ライブラリは「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"}
new_hash = Hash.new
your_hash.each{ |k,v| new_hash[k.to_s] = v }
new_hashはyour_hashと同じですが、文字列キーを使用します
キーをシンボルから文字列に明示的に転送できます。hash = hash.map { |k, v| [k.to_s, v] }.to_h
ここに来て、次のものよりも良いものがあるかどうかを確認しました。
JSON.parse(hash.to_json)
しかし、私は私が持っているものに固執すると思います。
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 に追加されました