哈希树深度 Ruby

3

我将编写一个方法,接收嵌套的哈希作为输入,并返回带有“深度”键的哈希。例如,以下输入:

tree = { 
  a: 1,
  b: 2, 
  c: { d: { e: 3 } }
}

将产生以下返回值:
{
  a: 1,
  b: 2,
  c: {
    d: {
      e: 3,
      depth: 2
    },
    depth: 1
  },
  depth: 0
}

如果输入不是哈希表,则该函数应返回nil。
这是我想出的方案:
def depth(hash)
num = 0
hash.each do |key, value|
    if value.class == Hash
    num += 1
     v[:depth] = num
    value.each do |k, v|
         if v.class == Hash
         num += 1
         v[:depth] = num
         v.each do |ky, val|
             if val.class == Hash
             num += 1
             v[:depth] = num
             val.each do |ke, vl|
                 if vl.class == Hash
                 num += 1
                v[:depth] = num
                 end
               end
             end
           end
         end
       end
    end
    num = 0
   end
end

但它仅限于哈希深度为4,我不能一直让这个方法变得更大。


3
“我不能仅仅不停地扩大这个方法。” “确实如此。这就是递归存在的原因。” - matt
@matt 递归是我最终使用的方法,类似于Cary Swoveland的答案。(几乎是他代码的完全复制) - Anonymous
1个回答

1
尝试一下。
def depth(h, i=0)
  h.each_with_object(depth: i) { |(k,v),g| g[k] = v.is_a?(Hash) ? depth(v, i+1) : v }
end

depth { a: 1, b: 2, c: { d: { e: 3 } }
  #=> {:depth=>0, :a=>1, :b=>2, :c=>{:depth=>1, :d=>{:depth=>2, :e=>3}}}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接