Ruby 帮助。我应该如何递归显示这些数据?

Ruby help. How should I recurse through this data to be display it?

所以我有我试图从中学习的数据,看起来与我在下方发布的数据相似。为了简单地解释我的需求,我会说我试图从数组中的每个项目中提取 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,
                values: [],
                last: true,
                parent: 104
              }
            ],
            last: false,
            parent: 102
          }
        ],
        last: false,
        parent: 100
      }
    ],
    last: false,
    parent: nil
  },
  {
    id: 106,
    values: [
      {
        id: 107,
        values: [
          {
            id: 110,
            values: [],
            last: true,
            parent: 107
          }
        ],
        last: false,
        parent: 106
      },
      {
        id: 108,
        values: [
          {
            id: 109,
            values: [],
            last: true,
            parent: 108
          }
        ],
        last: false,
        parent: 106
      }
    ],
    last: false,
    parent: nil
  }
]

因此,对于该样本数据,我想知道如何让它看起来像这样:

100
    101
        103
    102
        104
            105


106
    107
        110
    108
        109

因此,即使我只是弄清楚如何以这种方式使用适当数量的空格将其打印到控制台以指示每个片段来自哪个父 ID,也可以解决我的问题。 但希望这有助于表明我正在努力实现的目标。在此先感谢您提供有关如何处理此问题的任何建议。

这是一道递归题。您可以使用递归 function/method 调用(堆栈的隐式使用)或显式堆栈数据结构来解决它。

下面是如何使用递归调用解决它:

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- 递归模式。

所以在这个例子中,我决定我将使用额外的 space 递归打印出更深层次 (depth + 1) # recursive pattern 的结果,我将从 0 # initial state 开始] spaces 在开头,当没有更多 object[:values] # termination state.

时,我会 stop/return