2016-03-25 11 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.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]