问题描述
因此,我想从中学到的数据看起来与我发布的内容相似。为了简化解释我的需求,我将说我试图从数组中的每个项目中提取ID,然后从数组中该对象的值中提取每个ID。等等等等。我已经尝试了很多方法来实现此目的,但是我对解决方案的实际效果并不了解。我对递归还不满意,但是这似乎是一种缺乏知识的情况。请让我知道是否需要更多信息,但我的主要目的是弄清楚如何按父级顺序访问这些数据。
objects = [
{
id: 100,values: [
{
id: 101,values: [
{
id: 103,values: [],last: true,parent: 101
}
],last: false,parent: 100
},obj_c: {
id: 102,values: [
{
id: 104,values: [
{
id: 105,parent: 104
}
],parent: 102
}
],parent: 100
}
],parent: nil
},{
id: 106,values: [
{
id: 107,values: [
{
id: 110,parent: 107
}
],parent: 106
},{
id: 108,values: [
{
id: 109,parent: 108
}
],parent: 106
}
],parent: nil
}
]
因此,使用该示例数据,我想知道如何使它看起来像这样:
100
101
103
102
104
105
106
107
110
108
109
因此,即使我只是想知道如何以这种方式将其打印到控制台上,并带有适当的空白量以指示每块来自哪个父ID,也可以解决我的问题。 但是希望这有助于表明我正在尝试实现的目标。预先感谢您提供有关如何解决此问题的建议。
解决方法
这是递归问题。您可以使用递归函数/方法调用(隐式使用堆栈)或显式堆栈数据结构来解决它。
以下是使用递归调用解决问题的方法:
def print_object(object,depth)
print " " * depth
puts object[:id]
object[:values].each do |o|
print_object(o,depth + 1)
end if object[:values]
end
objects.each do |object|
print_object(object,0)
end
在编写递归解决方案时,请始终考虑: 1-初始状态。 2-终止状态。 3-递归模式。
因此,在此示例中,我决定将递归地打印出具有更大空间的结果,以用于更深层次的(depth + 1) # recursive pattern
,并且将从开头的0 # initial state
空格开始,当不再有object[:values] # termination state
时,我将停止/返回。