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

85
我正在使用 Ruby on Rails 3.2.2,我希望可以“轻松”/“快速”地将哈希键从 Symbol 类型更改为 String 类型。也就是说,从 {:one => "Value 1", :two => "Value 2", ...} 更改为 {"one" => "Value 1", "two" => "Value 2", ...}

我该如何用尽可能少的代码实现这个功能?


5
如果您使用的是HashWithIndifferentAccess而不是哈希表,那么这个过程将自动完成。 - Mark Thomas
9个回答

130

31
deep_stringify_keys是递归的,但我相信它只存在于Rails 4中:http://apidock.com/rails/v4.0.2/Hash/deep_stringify_keys - Romain Paulus

21
使用Hash类的stringify_keys/stringify_keys!方法。
你还可以使用some_hash.with_indifferent_access返回一个Hash实例,在该实例中,键可以指定为符号或字符串,没有区别。

18

1
这不会进行深度转换。 - Arian Faurtosh
但是它将在没有Rails的情况下进行浅层转换。 - B Seven

15

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”作为键,则后者将优先并覆盖前者。


5

来自Rails的stringify_keys方法

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


该方法用于将哈希表中所有的键转换成字符串类型。在Ruby on Rails中,它经常被用于接收参数时将参数的key从symbol类型转换为字符串类型。
hash = { name: 'Rob', age: '28' }
hash.stringify_keys
# => { "name" => "Rob", "age" => "28" }

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

2
 new_hash = Hash.new
 your_hash.each{ |k,v| new_hash[k.to_s] = v }

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


1
你可以显式地将键从符号转换为字符串:
hash = hash.map { |k, v| [k.to_s, v] }.to_h

0

我来这里看看是否有比以下更好的选择:

JSON.parse(hash.to_json)

但我想我会坚持我现在拥有的。


1
请注意,这种策略会将任何符号值转换为字符串,请小心使用。 - Tom

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接