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

如何生成嵌套Hash的所有键完整路径数组?Ruby技术求助

Ruby哈希获取所有键的完整路径数组实现方案

我来给你分享两种可行的实现方法,不管是递归还是迭代方式,都能轻松得到你想要的结果:

方法一:递归遍历(简洁直观)

递归是处理嵌套结构最常用的方式,代码逻辑清晰,容易理解:

def flatten_key_paths(hash, prefix = "", result = [])
  hash.each do |key, value|
    # 生成当前键的完整路径
    current_path = prefix.empty? ? key.to_s : "#{prefix}#{key}"
    # 将路径加入结果数组
    result << current_path
    # 如果当前值还是哈希,就递归处理嵌套结构
    flatten_key_paths(value, current_path, result) if value.is_a?(Hash)
  end
  result
end

# 测试一下
my_hash = {"key1"=> {"key2"=> {"key3"=> "value"}}, "key4"=> "value"}
p flatten_key_paths(my_hash)
# 输出: ["key1", "key1key2", "key1key2key3", "key4"]

代码解释:

  • 方法接受三个参数:待处理的哈希hash、当前路径前缀prefix(默认空字符串)、存储结果的数组result(默认空数组)。
  • 遍历哈希的每个键值对,根据前缀拼接出当前键的完整路径。
  • 把生成的路径加入结果数组,若当前值是嵌套哈希,就带着新的前缀递归调用方法。
  • 最后返回整理好的结果数组。

方法二:迭代遍历(避免栈溢出)

如果你的哈希嵌套层级非常深,递归可能会触发栈溢出问题,这时候可以用迭代的方式,借助栈来处理:

def flatten_key_paths_iterative(hash)
  result = []
  # 初始化栈,把哈希的键值对转换成[路径字符串, 值]的形式
  stack = hash.map { |key, value| [key.to_s, value] }

  until stack.empty?
    current_path, value = stack.pop
    result << current_path
    # 如果当前值是哈希,就把嵌套的键值对拼接新路径后压入栈
    if value.is_a?(Hash)
      value.each do |key, nested_value|
        stack << ["#{current_path}#{key}", nested_value]
      end
    end
  end

  # 因为栈是后进先出,最后需要反转结果得到正确顺序
  result.reverse
end

# 测试示例
my_hash = {"key1"=> {"key2"=> {"key3"=> "value"}}, "key4"=> "value"}
p flatten_key_paths_iterative(my_hash)
# 输出: ["key1", "key1key2", "key1key2key3", "key4"]

代码解释:

  • 用栈来存储待处理的路径和对应的值,初始时把顶层哈希的键值对都压入栈。
  • 循环弹出栈顶元素,将路径加入结果数组;如果对应的值是哈希,就把它的键值对拼接新路径后压入栈。
  • 由于栈的“后进先出”特性,最后需要反转结果数组才能得到和递归方式一致的顺序。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 08:07:46