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

use*_*882 50 ruby hash ruby-on-rails ruby-on-rails-3

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

如何通过尽可能少地使用代码来实现?

Vik*_*rón 76

只需调用stringify_keys(或stringify_keys!)

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

  • `deep_stringify_keys` 是递归的,但我相信它只在 Rails 4 中:http://apidock.com/rails/v4.0.2/Hash/deep_stringify_keys (16认同)
  • 小心这个..它不能递归地工作. (5认同)

jdo*_*doe 17

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

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


eli*_*eli 11

stringify_keys很好,但只在Rails中可用.这是我如何在一行中完成它,没有依赖关系:

new_hash = Hash[your_hash.collect{|k,v| [k.to_s, v]}]
Run Code Online (Sandbox Code Playgroud)

这适用于Ruby 1.8.7及更高版本.如果您使用的是Ruby 2.1,则可以:

new_hash = a.collect{|k,v| [k.to_s, v]}.to_h
Run Code Online (Sandbox Code Playgroud)

请注意,此解决方案不是递归的,也不会正确处理"重复"键.例如.如果你有:key"key"你的哈希中的键,最后一个将优先并覆盖第一个.


moo*_*eds 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


小智 5

来自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" }
Run Code Online (Sandbox Code Playgroud)