1, "two" => 2, "three" => 3} hash2 = hash1.reduce({}){ |h, (k,v)| h.me-6ren">
gpt4 book ai didi

ruby-on-rails - 如何优雅地对 'nested' 哈希值进行 symbolize_keys

转载 作者:数据小太阳 更新时间:2023-10-29 06:21:54 27 4
gpt4 key购买 nike

考虑以下代码:

  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

更新:

答案是 hash4.deep_symbolize_keys for Rails <= 5.0

答案是 JSON.parse(JSON[hash4], symbolize_names: true) for Rails > 5

最佳答案

有几种方法可以做到这一点

  1. 有一个 deep_symbolize_keys method in Rails

    hash.deep_symbolize_keys!

  2. 如@chrisgeeq 所述,有一个 deep_transform_keys Rails 4 提供的方法。

    hash.deep_transform_keys(&:to_sym)

    还有一个 bang ! 版本来替换现有对象。

  3. 还有一个方法叫with_indifferent_access .这允许您使用字符串或符号访问散列,就像 Controller 中的 params 一样。此方法没有对应的 bang。

    hash = hash.with_indifferent_access

  4. 最后一个是使用JSON.parse。我个人不喜欢这样,因为您正在进行 2 次转换 - 哈希到 json,然后 json 到哈希。

    JSON.parse(JSON[h], symbolize_names: true)

更新:

16/01/19 - 添加更多选项并注意弃用 deep_symbolize_keys

12 年 4 月 19 日 - 删除已弃用的注释。只有方法中使用的实现被弃用,而不是方法本身。

关于ruby-on-rails - 如何优雅地对 'nested' 哈希值进行 symbolize_keys,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24927653/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com