从所有第一个元素转换数组数组

时间:2014-10-02 08:12:59

标签: ruby-on-rails ruby arrays

我正在尝试转换为以下数组数组

[
  "master_type", # [0]
  [
    "type_1",    # [1][0]
    [
      "type_2",  # [1][1][0]
      [
        "type_3" # [1][1][1][0]
      ]
    ],
    [
      "type_3"   # [1][2][0]
    ]
  ],
  [
    "type_4",    # [2][0]
    [
      "type_2"   # [2][1][0]
    ]
  ],
  [
    "type_2",    # [3][0]
    "type_3"     # [3][1]
  ],
  "type_3"       # [3][1]
]

类似

[
  ["master_type", "type_1", "type_2", "type_3"],
  ["master_type", "type_1", "type_3"],
  ["master_type", "type_4", "type_2"],
  ["master_type", "type_2", "type_3"],
  ["master_type", "type_3"]
]

最后,我想阅读这个树,并在有第一个元素时收集所有第一个元素,然后在再次执行之前将其删除,直到我的第一个数组为空。

我无法修复它。你有什么想法 ?

重要的是要注意这个例子是字符串,但我会用更复杂的对象来做

提前谢谢。

1 个答案:

答案 0 :(得分:1)

这个实现是递归的,但我怀疑它会溢出。如果你的树很深,你可能想要迭代它。

def flatten_tree(tree)
  parent, *subtree = tree

  return [[parent]] if subtree.empty?

  subtree.flat_map do |element|
    flatten_tree(element).each { |children| children.unshift(parent) }
  end
end

答案根据sawa的评论进行了更新。