如何递归地将作为符号的Ruby Hashes的键转换为String

dhr*_*moy 1 ruby recursion hash

假设我有以下哈希或嵌套哈希:

h = { :a1 => { :b1 => "c1" },
      :a2 => { :b2 => "c2"},
      :a3 => { :b3 => "c3"} }
Run Code Online (Sandbox Code Playgroud)

我想创建一个方法,将哈希作为参数,并递归地将所有键(例如符号的键:a1)转换为String(例如"a1").到目前为止,我已经提出了以下方法,它不起作用并返回{"a1"=>{:b1=>"c1"}, "a2"=>{:b2=>"c2"}, "a3"=>{:b3=>"c3"}}.:

def stringify_all_keys(hash)
    stringified_hash = {}
    hash.each do |k, v|
        stringified_hash[k.to_s] = v
        if v.class == Hash
            stringify_all_keys(stringified_hash[k.to_s])
        end
    end
    stringified_hash
end
Run Code Online (Sandbox Code Playgroud)

我做错了什么以及如何将所有键转换为字符串,如下所示:

{"a1"=>{"b1"=>"c1"}, "a2"=>{"b2"=>"c2"}, "a3"=>{"b3"=>"c3"}}
Run Code Online (Sandbox Code Playgroud)

Mic*_*ohl 6

如果您ActiveSupport已经使用它或者可以使用它,那么deep_stringify_keys就是您正在寻找的.

hash = { person: { name: 'Rob', age: '28' } }

hash.deep_stringify_keys
# => {"person"=>{"name"=>"Rob", "age"=>"28"}}
Run Code Online (Sandbox Code Playgroud)


Kim*_*hto 6

如果你的值是字符串、数字等基本对象,那就太快了:

require 'json'
JSON.parse(JSON.dump(hash))
Run Code Online (Sandbox Code Playgroud)