69

我正在使用 Ruby on Rails 3.2.2,我想“轻松”/“快速”地将哈希键从Symbols 更改为Strings。也就是说,从{:one => "Value 1", :two => "Value 2", ...}{"one" => "Value 1", "two" => "Value 2", ...}

我怎样才能通过尽可能少的代码来做到这一点?

4

9 回答 9

117

只需调用stringify_keys(或stringify_keys!

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

于 2012-05-11T10:31:48.377 回答
19

类的使用stringify_keys/stringify_keys!方法Hash

您还可以使用some_hash.with_indifferent_access返回一个 Hash 实例,其中您的键可以指定为符号或字符串,没有区别。

于 2012-05-11T10:30:57.877 回答
13

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"作为哈希中的键,则最后一个将优先并覆盖第一个。

于 2016-04-29T10:47:52.503 回答
7

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

于 2019-08-13T12:49:37.357 回答
5

stringify_keys from rails

http://api.rubyonrails.org/classes/Hash.html#method-i-stringify_keys

hash = { name: 'Rob', age: '28' }
hash.stringify_keys
# => { "name" => "Rob", "age" => "28" }
于 2014-04-23T12:12:20.273 回答
3

有一个不错的库可以解决问题,该库是“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"}
于 2012-05-11T10:43:14.453 回答
2
 new_hash = Hash.new
 your_hash.each{ |k,v| new_hash[k.to_s] = v }

new_hash 将与 your_hash 相同,但带有字符串键

于 2012-05-11T10:31:04.480 回答
0

我来这里看看是否有比这更好的东西:

JSON.parse(hash.to_json)

但我想我会坚持我所拥有的。

于 2018-11-16T22:52:21.353 回答
0

您可以将密钥从符号显式传输到字符串:
hash = hash.map { |k, v| [k.to_s, v] }.to_h

于 2019-06-11T06:25:51.303 回答