【发布时间】:2014-09-15 15:37:18
【问题描述】:
考虑以下代码:
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 中 Hash 的 'symbolize_keys' 方法让我们可以轻松地将字符串键转换为符号。但我正在寻找一种优雅的方法来将所有键(主键加上 hash4 中所有散列的键)转换为符号。
关键是要让自己摆脱我 (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
Rails > 5 的答案是 JSON.parse(JSON[hash4], symbolize_names: true)
【问题讨论】:
-
@jvnill - 把它写成答案...
-
@SyedHumzaShah 但是,请注意,您必须“深度符号化”表明您对哈希中的实际内容缺乏了解。避免使用该方法并使用您对如何构建数据结构的知识。如果它是完全动态的以至于您确实需要深度符号化,您可以考虑使用树对象,其遍历方法和其他与树相关的资产。
-
@BorisStitnicky 如果您的哈希不是由您生成的,例如一个你正在加载的配置文件,那么通常不知道哈希中的实际内容......
标签: ruby-on-rails ruby hash dry