嵌套哈希中任何位置的任何键实例

时间:2016-03-25 05:54:02

标签: ruby

给出像这样的哈希:

h = {
  "actual_amount" => 20,
  "otherkey" => "value",
  "otherkey2" => [{"actual_amount" => 30, "random_amount" => 45}]
}

哪里有任意数量的嵌套层,是否有一种简单的方法来获取actual_amount的键的所有键值对(或仅仅是值)?

2 个答案:

答案 0 :(得分:1)

我假设键的值是文字或哈希数组。

这个问题显然需要递归解决方案。

def amounts(h)
  h.each_with_object([]) do |(k,v),a|
    case v
    when Array
      v.each { |g| a.concat amounts(g) }
    else
      a << v if k == "actual_amount"
    end
  end
end

假设

h = {
  "actual_amount"=>20,
  1=>2,
  2=>[
      { "actual_amount"=>30,
        3=>[
            { "actual_amount" => 40 },
            { 4=>5 }
           ]
      },
      { 5=>6 }
     ]
}

然后

amounts(h)
  #=> [20, 30, 40] 

答案 1 :(得分:1)

使用Cary提供的哈希作为输入:

▶ flatten = ->(inp) do
▷   [*(inp.respond_to?(:map) ? inp.map(&:flatten) : inp)]
▷ end
▶ res = flatten(h).first
▶ res.select.with_index do |_, i|
▷   i > 0 && res[i - 1] == 'actual_amount'
▷ end
#⇒ [20, 30, 40]