2017-01-15 8 views
0

stringまたはarrayの中に入力があります。hashに入力される可能性があります。ハッシュ内の配列から最後の値にアクセス

しかし、

  • Hashは再帰的である可能性があります。
  • Arrayは複数の値を持つことができます。

例;

# ex.1 "name must be a string" 
    # ex.2 {"name"=>["name must be a string"]} 
    # ex.3 {"name"=>["name must be a string", "name must be greater than 3"]} 
    # ex.4 {"payment"=> {"currency"=>["currency must be a jpy"]}} 
    # ex.5 {"payment"=> {"currency"=>["currency must be a jpy", "currency must be string"]}} 

文字列または配列内の最後の値のそれぞれをレンダリングしたいと思います。

# ex.1 method(x) => "name must be a string" 
    # ex.2 method(x) => "name must be a string" 
    # ex.3 method(x) => "name must be a string"/ "name must be greater than 3" 
    # ex.4 method(x) => "currency must be a jpy" 
    # ex.5 method(x) => "currency must be a jpy"/ "currency must be string" 
+1

をそれを投稿してください '{1 => {2 => [3,4]、3 => [5、 6]} '? '{1 => {2 => [[4,5]、{6 => 7}]}}'の場合は? –

+0

[3,4,5,6]が返されます。 – Tosh

+0

私は深い反復配列とハッシュhttps://github.com/am-kantox/iteraptorのための小さなライブラリを作成しました - あなたはそれがインスピレーションのためのコードを確認したいかもしれません。 – mudasobwa

答えて

1
def leaves(input, acc = []) 
    if input.is_a?(Enumerable) 
    input.each_with_object(acc) { |e, acc| leaves([*e].last, acc) } 
    else 
    acc << input 
    end 
end 

leaves({ 1=>{2=>[3,4], 3=>[5,[6, 7]] }}) 
#⇒ [3, 4, 5, 7] 
+0

OMG。これが1つです!ありがとうございました!このような再帰的な方法を使いたかったのです。ところで、[* e]は何ですか?私はルビに新しいです。 – Tosh

+0

配列の場合、 'e'はハッシュのための単一の要素になります、' e'はkeyとvalueという2つの要素の配列になります。私は配列を何かから作り出し、入れ子の条件文を避けるために最後の要素を得る。擬似コードでは、[e OR [k、v]] .plast.last⇒e OR v'となります。 – mudasobwa

+1

私はこの質問を誤解しているかもしれません。私は5がここにいるはずだとは思わない。 –

0
def last_values(val) 
    vals = if val.is_a?(Hash) 
      val = val[val.keys.last] 
      return val.values.flatten if val.is_a?(Hash) # for Hash fetch the last one 
      return val.flatten # for Array 
     else 
      [val] 
     end 

    vals.each do |each| 
    p each 
    end 
end 

これは仕事ができます。あなたが他の良い解決策を持っている場合 しかし、の戻り値になりますどのような:)

関連する問題