2017-05-27 2 views
0

ハッシュとネストされた配列を持つ配列を単純なコード再帰的なマップにしました。マップのようにメソッドの戻り値の各値を新しい値に変更したい。 しかし、何も返さない配列が返ってきたのですが、なぜか分かりません。Rubyでネストされた配列をマップしますが、戻り値はすべてnilです

私が思う

class DataTest 
    def m_arr 
    [ 
     {:path => 'index'}, 
     {:path => 'about'}, 
     {:path =>'galleries'}, 
     {:path =>'views'}, 
     {:path =>'contact', 
     :child => [ 
     {:path => 'contact/find_us'} 
     ]} 
    ] 
    end 

    def menu_struct_arr(m_arr) 
    m_arr.map do |menu| 
     menu = menulize(menu) 
     if menu.child 
     menu_struct_arr(menu.child) 
     end 
    end 
    end 

    Menu = Struct.new(:path, :child) 

    def menulize(item) 
    Menu.new(item[:path], item[:child]) 
    end 
end 

が最後のコマンドである[ゼロ、ゼロ、ゼロ、ゼロ、[]はnil]:(menu.child場合)、nilを取得し、各項目ときに戻りますマッピング。もし私が間違っていると私を修正してください。

答えて

0

mapメソッドに戻り値を追加することを忘れないでください。あなたの場合、再帰関数を使用しても、ifステートメントがトリガされていなくても、常にゼロになります。だから、この1とあなたの方法を修正する必要があります。

def menu_struct_arr(m_arr) 
    m_arr.map do |menu| 
    menu = menulize(menu) 
    if menu.child 
     menu_struct_arr(menu.child) 
    end 
    menu 
    end 
end 

私はいくつかのclenupでそれを書くためにあなたをお勧めします。

class DataTest 
    Menu = Struct.new(:path, :childs) 

    ARR = 
    [ 
     {path: 'index'}, 
     {path: 'about'}, 
     {path: 'galleries'}, 
     {path: 'views'}, 
     {path: 'contact', childs: [{path: 'contact/find_us'}]} 
    ] 

    def array_menulize(items) 
    items.map do |item| 
     single_menulize(item) 
    end 
    end 

    def single_menulize(item) 
    menulized = Menu.new(item[:path], item[:childs]) 
    array_menulize(menulized.childs) if menulized.childs 
    menulized 
    end 
end 
+0

ありがとうございます、ありがとう、それは構造体配列の戻り値を取得しますが、どのように私は子供の中でハッシュを反復することができますか?または、私はこのデータ構造を使用すべきではありません、または私はメニューツリーをループする別の方法を試す必要がありますか? –

+0

実際、私はなぜあなたのアプローチで何を試したのか理解できません。しかし、私はエラーについてあなたにいくつかの説明をしました。ですから、 '' Hash''をルビで繰り返し処理したいのであれば '' Array''と同じくらい簡単です。 [Hash#each](http://ruby-doc.org/core-2.1.5/Hash.html#method-i-each)のようなメソッドを使います。 – DjezzzL

関連する問題