我正在使用Ruby on Rails 3.2.2,我希望“轻松”/“快速”将散列密钥从Symbol
更改为String
s。也就是说,从{:one => "Value 1", :two => "Value 2", ...}
到{"one" => "Value 1", "two" => "Value 2", ...}
。
如何通过尽可能减少代码来实现这一目标?
答案 0 :(得分:65)
只需调用stringify_keys(或stringify_keys!)
即可答案 1 :(得分:16)
使用stringify_keys
类的stringify_keys!
/ Hash
方法。
您还可以使用some_hash.with_indifferent_access
返回一个哈希实例,其中您的密钥可以指定为符号或字符串,没有区别。
答案 2 :(得分:10)
new_hash = Hash[your_hash.collect{|k,v| [k.to_s, v]}]
很不错,但只适用于Rails。
这是我如何在一行中完成它,没有依赖关系:
new_hash = a.collect{|k,v| [k.to_s, v]}.to_h
这适用于Ruby 1.8.7及更高版本。 如果你正在使用Ruby 2.1,你可以这样做:
:key
请注意,此解决方案不是递归的,也不会正确处理“重复”键。例如。如果你的哈希中有"key"
和tmcartepo
作为键,那么最后一个将优先并覆盖第一个。
答案 3 :(得分:5)
http://api.rubyonrails.org/classes/Hash.html#method-i-stringify_keys
hash = { name: 'Rob', age: '28' }
hash.stringify_keys
# => { "name" => "Rob", "age" => "28" }
答案 4 :(得分:3)
有一个很棒的库可以解决问题,库是“facets / hash / 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"}
答案 5 :(得分:2)
new_hash = Hash.new
your_hash.each{ |k,v| new_hash[k.to_s] = v }
new_hash与your_hash相同,但使用字符串键
答案 6 :(得分:0)
我来这里看看是否有比以下更好的东西:
JSON.parse(hash.to_json)
但是我想我会坚持下去。
答案 7 :(得分:0)
您可以将密钥从符号显式传输到字符串:
hash = hash.map { |k, v| [k.to_s, v] }.to_h
答案 8 :(得分:0)
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/13583