考虑下面的代码:
hash1 = {"one" => 1, "two" => 2, "three" => 3}
hash2 = hash1.reduce({}){ |h, (k,v)| h.merge(k => hash1) }
hash3 = hash2.reduce({}){ |h, (k,v)| h.merge(k => hash2) }
hash4 = hash3.reduce({}){ |h, (k,v)| h.merge(k => hash3) }
hash4是"嵌套"哈希,即带有字符串键和类似"嵌套"哈希值的哈希.
Rails中哈希的"symbol_keys"方法让我们可以轻松地将字符串键转换为符号.但我正在寻找一种将所有键(主键加上hash4中所有散列的键)转换为符号的elegant种方法.
关键是要让自己从我(imo)个丑陋的解决方案中解脱出来:
class Hash
def symbolize_keys_and_hash_values
symbolize_keys.reduce({}) do |h, (k,v)|
new_val = v.is_a?(Hash) ? v.symbolize_keys_and_hash_values : v
h.merge({k => new_val})
end
end
end
hash4.symbolize_keys_and_hash_values #=> desired result
仅供参考:安装程序是Rails 3.2.17和Ruby 2.1.1
更新:
Rails的答案是hash4.deep_symbolize_keys
<;=5
Answer is JSON.parse(JSON[hash4], symbolize_names: true)
for Rails > 5