给出像这样的哈希:
h = {
"actual_amount" => 20,
"otherkey" => "value",
"otherkey2" => [{"actual_amount" => 30, "random_amount" => 45}]
}
哪里有任意数量的嵌套层,是否有一种简单的方法来获取actual_amount
的键的所有键值对(或仅仅是值)?
答案 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]