如何将哈希键从“符号”更改为“string”?

我正在使用Ruby on Rails 3.2.2,并且我想“很容易”/“快速”地将哈希键从Symbol s更改为String s。 也就是说,从{:one => "Value 1", :two => "Value 2", ...} to {"one" => "Value 1", "two" => "Value 2", ...}

我怎样才能通过使用更less的代码尽可能?

只需调用stringify_keys(或stringify_keys!)

http://apidock.com/rails/Hash/stringify_keys

使用stringify_keys / stringify_keys! Hash类的方法。

您也可以使用some_hash.with_indifferent_access返回一个Hash实例,其中您的密钥可以被指定为符号或string,没有区别。

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 

请注意,此解决scheme不是recursion的,也不会正确处理“重复”键。 例如。 如果你有:key"key"作为你的哈希键,最后一个将优先和覆盖第一个。

来自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" } 
  new_hash = Hash.new your_hash.each{|k,v| new_hash[k.to_S] = v} 

new_hash将与your_hash相同,但使用string键

有一个很好的库,这个技巧,库是“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"}