我正在使用 Ruby on Rails 3.2.2,我想“轻松”/“快速”地将哈希键从Symbol
s 更改为String
s。也就是说,从{:one => "Value 1", :two => "Value 2", ...}
到{"one" => "Value 1", "two" => "Value 2", ...}
。
我怎样才能通过尽可能少的代码来做到这一点?
我正在使用 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!
)
类的使用stringify_keys
/stringify_keys!
方法Hash
。
您还可以使用some_hash.with_indifferent_access
返回一个 Hash 实例,其中您的键可以指定为符号或字符串,没有区别。
stringify_keys
很好,但仅在 Rails 中可用。这是我将如何在一行中做到这一点,零依赖:
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"
作为哈希中的键,则最后一个将优先并覆盖第一个。
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
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 相同,但带有字符串键
我来这里看看是否有比这更好的东西:
JSON.parse(hash.to_json)
但我想我会坚持我所拥有的。
您可以将密钥从符号显式传输到字符串:
hash = hash.map { |k, v| [k.to_s, v] }.to_h