首页 > 解决方案 > ruby - 将深度键添加到较大散列中的每个嵌套散列

问题描述

我正在尝试编写一个将嵌套散列作为输入并返回带有添加“深度”键的散列的方法。因此,例如:

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

会返回:

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

这是我想出的一些代码,它适用于这种情况,或者任何其他深度不超过 2 的哈希,但我的做法是错误的。我试图弄清楚如何使它适用于任何深度。

def depth(hash)
  hash.values.to_a.map!{|elem| if elem.class==Hash; elem.values.to_a.map!{|el| el.class==Hash ? el[:depth] = 2 : elem}; elem[:depth] = 1; else; elem; end}
  hash[:depth] = 0
  p hash
end

您可以假设输入是哈希。谢谢 :-)

标签: rubynestedkey

解决方案


与现有答案类似,但可能更惯用

def add_depth(hash, depth = 0)
  hash
    .transform_values { |v| v.is_a?(Hash) ? add_depth(v, depth + 1) : v }
    .merge(depth: depth)
end

它基本上和其他的一样,但是将新哈希的创建和迭代委托给 ruby​​ 核心,这可以说是更优化 的,也可能由虚拟机更好地优化


推荐阅读