求助:如何将Ruby哈希的键转换为驼峰式格式?
如何将Ruby哈希的键递归转换为驼峰式?
问题描述
给定如下嵌套哈希:
hash = {test_user: '1', user_details: {first_name: "Test"}}
需要将所有键(包括嵌套哈希的键)从蛇形命名转换为驼峰式,期望输出:
output = {testUser: '1', userDetails: {firstName: "Test"}}
原代码的问题分析
你当前的代码存在几个核心问题:
- 错误地将键转换为全大写,而非驼峰式命名
- 处理嵌套哈希时,错误复用整个原哈希的键转换结果,导致嵌套结构完全混乱
- 仅当哈希中存在哈希类型的值时才处理,遗漏了顶层哈希无嵌套的场景
- 没有递归处理深层嵌套的哈希结构
修正后的代码
我们需要编写一个递归方法来处理所有层级的哈希键转换,同时实现蛇形到驼峰式的正确转换逻辑:
def camelize_keys(hash) hash.each_with_object({}) do |(key, value), result| # 将蛇形键转换为驼峰式:分割后首词小写,后续词首字母大写再拼接 camelized_key = key.to_s.split('_').then do |parts| parts.first + parts.drop(1).map(&:capitalize).join end.to_sym # 递归处理嵌套哈希 result[camelized_key] = value.is_a?(Hash) ? camelize_keys(value) : value end end # 测试代码 hash = {test_user: '1', user_details: {first_name: "Test"}} output = camelize_keys(hash) puts output.inspect
代码说明
- 驼峰转换逻辑:
- 将键转为字符串后用下划线分割成数组
- 保留第一个单词的小写形式,后续每个单词首字母大写
- 最后转换回符号(匹配期望输出的符号键格式)
- 递归处理嵌套:
- 遍历哈希的每个键值对,若值是哈希类型,则递归调用
camelize_keys方法处理 - 非哈希类型的值直接保留
- 遍历哈希的每个键值对,若值是哈希类型,则递归调用
- 通用性:
- 无论哈希是否有嵌套,都能正确处理
- 支持多层深层嵌套的哈希结构
运行结果
执行上述代码后,输出结果与期望完全一致:
{:testUser=>"1", :userDetails=>{:firstName=>"Test"}}
内容的提问来源于stack exchange,提问作者Kumar Nikhil
相关产品推荐
相关产品推荐

