在Ruby中映射嵌套数组,但它返回所有项目为零

时间:2017-05-27 15:33:46

标签: ruby

我有一个简单的代码递归映射一个带有散列和嵌套数组的数组。我想让每个项目更改为方法返回值的新值,就像map总是那样。 但我得到一个nil数组返回,我不知道为什么?

  

[nil,nil,nil,nil,[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

我认为是最后一个命令:(如果是menu.child),获取nil并在映射时返回每个项目。如果我猜错了,请纠正我。

1 个答案:

答案 0 :(得分:0)

您忘记将返回值添加到map方法。在您使用递归函数的情况下,或者即使未触发if语句,它也总是为零。所以你应该用这个来修复你的方法:

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