Ruby on rails 如何将哈希键从'Symbol'更改为'String's?
我使用的是RubyonRails 3.2.2,我想“轻松”/“快速”将哈希键从Ruby on rails 如何将哈希键从'Symbol'更改为'String's?,ruby-on-rails,ruby,ruby-on-rails-3,hash,Ruby On Rails,Ruby,Ruby On Rails 3,Hash,我使用的是RubyonRails 3.2.2,我想“轻松”/“快速”将哈希键从Symbols更改为Strings。也就是说,从{:one=>“Value 1”、:two=>“Value 2”、…}到{“one=>“Value 1”、“two”=>“Value 2”、…} 我如何通过尽可能少地使用代码来实现这一点?使用stringify\u键/stringify\u键哈希类的方法 您还可以使用some\u hash.with\u interference\u access返回一个散列实例,在该实例
Symbol
s更改为String
s。也就是说,从{:one=>“Value 1”、:two=>“Value 2”、…}
到{“one=>“Value 1”、“two”=>“Value 2”、…}
我如何通过尽可能少地使用代码来实现这一点?使用
stringify\u键
/stringify\u键代码>哈希类的方法
您还可以使用some\u hash.with\u interference\u access
返回一个散列实例,在该实例中,您的密钥可以指定为符号,也可以指定为无差异的字符串
new_hash = Hash.new
your_hash.each{ |k,v| new_hash[k.to_s] = v }
新的\u散列将与您的\u散列相同,但使用字符串键只需调用stringify\u键
(或stringify\u键!
)
有一个很好的库可以实现这一功能,该库是“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"}
从轨道上串接_键
stringify\u keys
很好,但仅在Rails中可用。
以下是我将如何在一行中完成它,并且没有依赖关系:
new_hash=hash[你的_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”
作为键,则最后一个将优先并覆盖第一个。我来这里是想看看是否有比以下更好的方法:
JSON.parse(hash.to_json)
但是我想我会坚持我所拥有的。您可以明确地将密钥从符号转移到字符串:
hash=hash.map{k,v|[k.to_s,v]}.to_h
hash=hash.transform_key(&:to_s)
将符号中的所有键转换为字符串
详情如下:
这是在ruby 2.5中添加的:如果您使用HashWithInferenceAccess而不是hash,那么这将自动为您完成。deep\u stringify\u keys
是递归的,但我相信它只适用于Rails 4:只适用于Rails项目。请小心使用此策略,因为它还会将任何符号值转换为字符串。这不会进行深度转换
JSON.parse(hash.to_json)