我有一个简单的代码递归映射一个带有散列和嵌套数组的数组。我想让每个项目更改为方法返回值的新值,就像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并在映射时返回每个项目。如果我猜错了,请纠正我。
答案 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