gpt4 book ai didi

ruby - 在 Ruby 中将嵌套哈希键从 CamelCase 转换为 snake_case

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

我正在尝试构建 API 包装器 gem,但在将哈希键从 API 返回的 JSON 转换为更像 Rubyish 的格式时遇到了问题。

JSON 包含多层嵌套,包括哈希和数组。我想做的是递归地将所有键转换为 snake_case 以便于使用。

这是我到目前为止所得到的:

def convert_hash_keys(value)
return value if (not value.is_a?(Array) and not value.is_a?(Hash))
result = value.inject({}) do |new, (key, value)|
new[to_snake_case(key.to_s).to_sym] = convert_hash_keys(value)
new
end
result
end

上面调用此方法将字符串转换为 snake_case:

def to_snake_case(string)
string.gsub(/::/, '/').
gsub(/([A-Z]+)([A-Z][a-z])/,'\1_\2').
gsub(/([a-z\d])([A-Z])/,'\1_\2').
tr("-", "_").
downcase
end

理想情况下,结果将类似于以下内容:

hash = {:HashKey => {:NestedHashKey => [{:Key => "value"}]}}

convert_hash_keys(hash)
# => {:hash_key => {:nested_hash_key => [{:key => "value"}]}}

我弄错了递归,我尝试过的这种解决方案的每个版本要么不转换超过第一级的符号,要么过分尝试转换整个散列,包括值。

尝试在辅助类中解决所有这些问题,而不是尽可能修改实际的 Hash 和 String 函数。

提前谢谢你。

最佳答案

如果您使用 Rails:

散列示例:camelCase 到 snake_case:

hash = { camelCase: 'value1', changeMe: 'value2' }

hash.transform_keys { |key| key.to_s.underscore }
# => { "camel_case" => "value1", "change_me" => "value2" }

来源: http://apidock.com/rails/v4.0.2/Hash/transform_keys

对于嵌套属性使用 deep_transform_keys 而不是 transform_keys,例如:

hash = { camelCase: 'value1', changeMe: { hereToo: { andMe: 'thanks' } } }

hash.deep_transform_keys { |key| key.to_s.underscore }
# => {"camel_case"=>"value1", "change_me"=>{"here_too"=>{"and_me"=>"thanks"}}}

来源:http://apidock.com/rails/v4.2.7/Hash/deep_transform_keys

关于ruby - 在 Ruby 中将嵌套哈希键从 CamelCase 转换为 snake_case,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8706930/

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