You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Ruby中如何将深度嵌套Hash递归转换为多维数组?

解决嵌套Hash递归转换为多维数组的问题

你的需求是把嵌套的Ruby Hash递归转换成对应的多维数组,当前代码没能正确处理value里的嵌套Hash,导致结果里11对应的value还是原Hash而非转换后的数组。我来帮你梳理问题并给出修复方案:

原代码的问题分析

原代码的核心问题在于:

  • 处理逻辑绕了弯路,试图直接修改原Hash的结构(比如hash[k.to_a] = hash.delete(k)),这种操作容易导致遍历过程中出现异常,而且完全没必要;
  • 当value是Hash时,只在特定条件下转成数组,且没有把递归处理后的结果赋值回去,导致内部的嵌套Hash没有被深层转换。

修复后的代码实现

我们可以用更简洁清晰的递归思路来实现,直接遍历Hash的键值对,对每个键和值递归判断处理:

def deep_to_a(hash)
  hash.map do |key, value|
    # 递归处理键:如果是Hash就继续转换,否则保持原值
    processed_key = key.is_a?(Hash) ? deep_to_a(key) : key
    # 递归处理值:同理
    processed_value = value.is_a?(Hash) ? deep_to_a(value) : value
    # 把处理后的键值组成数组
    [processed_key, processed_value]
  end
end

测试验证

运行你给出的测试用例:

h = {11=>{12=>13, 14=>15}, 16=>17}
p deep_to_a(h) # => [[11, [[12, 13], [14, 15]]], [16, 17]]

完全符合你的预期结果。

代码逻辑说明

这个实现的思路很直观:

  1. 用map遍历Hash的每一组键值对,map本身会返回一个数组,正好契合我们的转换需求;
  2. 对每个键和值分别判断,如果是Hash类型,就递归调用deep_to_a进行深层转换;如果不是,就直接保留原值;
  3. 最后把处理后的键和值包装成一个数组,所有这样的数组组合起来就是最终的多维数组。

这种方式不需要修改原Hash,递归逻辑清晰,也能正确处理任意层级的嵌套Hash。

内容的提问来源于stack exchange,提问作者Brunhilde Line

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 06:08:51