如何将哈希键从`Symbol`s更改为`String`s?

时间:2012-05-11 10:20:24

标签: ruby-on-rails ruby ruby-on-rails-3 hash

我正在使用Ruby on Rails 3.2.2,我希望“轻松”/“快速”将散列密钥从Symbol更改为String s。也就是说,从{:one => "Value 1", :two => "Value 2", ...}{"one" => "Value 1", "two" => "Value 2", ...}

如何通过尽可能减少代码来实现这一目标?

9 个答案:

答案 0 :(得分:65)

只需调用stringify_keys(或stringify_keys!)

即可

http://apidock.com/rails/Hash/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)

来自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" }

答案 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