如何生成嵌套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
相关产品推荐
相关产品推荐

