Symbol
Ruby on Rails 3.2.2を使用していますが、ハッシュキーを「簡単に」/「すばやく」変更したいと思いますString
。つまり、{:one => "Value 1", :two => "Value 2", ...}
から{"one" => "Value 1", "two" => "Value 2", ...}
。
できるだけ少ないコードを使用してそれを行うにはどうすればよいですか?
Symbol
Ruby on Rails 3.2.2を使用していますが、ハッシュキーを「簡単に」/「すばやく」変更したいと思いますString
。つまり、{:one => "Value 1", :two => "Value 2", ...}
から{"one" => "Value 1", "two" => "Value 2", ...}
。
できるだけ少ないコードを使用してそれを行うにはどうすればよいですか?
単に呼び出すstringify_keys
(またはstringify_keys!
)
クラスのstringify_keys
/stringify_keys!
メソッドを使用します。Hash
some_hash.with_indifferent_access
キーを記号または文字列として違いなく指定できるハッシュインスタンスを返すために使用することもできます。
stringify_keys
素晴らしいですが、Railsでのみ利用可能です。依存関係がゼロの場合、1行でこれを行う方法は次のとおりです。
new_hash = Hash[your_hash.collect{|k,v| [k.to_s, v]}]
これはRuby1.8.7以降で機能します。Ruby 2.1を使用している場合は、次のことができます。
new_hash = a.collect{|k,v| [k.to_s, v]}.to_h
このソリューションは再帰的ではなく、「重複」キーを適切に処理しないことに注意してください。例えば。ハッシュにキーがある場合は:key
、"key"
最後のキーが優先され、最初のキーが上書きされます。
hash = hash.transform_keys(&:to_s)
記号からすべてのキーを文字列に変換します。
詳細はこちら:https ://ruby-doc.org/core-2.6.3/Hash.html#method-i-transform_keys
これはruby2.5で追加されました:https ://bugs.ruby-lang.org/issues/13583
http://api.rubyonrails.org/classes/Hash.html#method-i-stringify_keys
hash = { name: 'Rob', age: '28' }
hash.stringify_keys
# => { "name" => "Rob", "age" => "28" }
トリックを実行する素晴らしいライブラリがあり、ライブラリは「ファセット/ハッシュ/キーの再生成」であり、メソッドはキーの再生成です!。それを使用する方法の以下の私の例を参照してください。過去のコピーです
> 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と同じですが、文字列キーがあります
私はここに来て、次よりも良いものがあるかどうかを確認しました。
JSON.parse(hash.to_json)
しかし、私は私が持っているものに固執すると思います。
キーを記号から文字列に明示的に転送できます。
hash = hash.map { |k, v| [k.to_s, v] }.to_h