2016-03-25 142 views
1

給定一個散列像這樣的任何位置鍵的任何實例:在嵌套散列

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

其中存在任何數量的嵌套的層,有一個簡單的方式來拔除所有的鍵 - 值對(或只是值actual_amount

+0

你的 「哈希」 是無效的。 – sawa

+0

如果** val **具有'actual_amount',您是否想獲得**鍵**?如果是這樣,試試這個'h.map {| k,v | (v.is_a?(Array)&& v.first [「actual_amount」]。present?)}' – Abhi

+0

似乎需要使用遞歸嗎? – coderz

回答

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] 
2

使用散列,由卡里提供,作爲輸入:

▶ 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]