使用整数转换数组,指示散列深度到散列

时间:2018-02-27 16:13:24

标签: arrays json ruby data-structures ruby-hash

我有以下数组:

[{text: "a", depth: 0},
 {text: "b", depth: 1},
 {text: "c", depth: 2},
 {text: "d", depth: 1}]

我想解决的问题是采用扁平数组(上图)并根据每个元素的深度创建一个嵌套结构。我需要它嵌套的原因是递归地构建一个列表(有序或无序),我不能用我拥有的数组。

以下是以某种方式,形状或形成所需的输出。我试图创建的嵌套结构的一般想法应该更清楚。

  { 
    text: "a", 
    depth: 0,
    sublevel: [
      {
        text: "a",
        depth: 1,
        sublevel: [
          {
            text: "b",
            depth: 2,
            sublevel: []
          }
        ]
      },
      {
        text: "d",
        depth: 1,
        sublevel: []
      }
    ]
  }

1 个答案:

答案 0 :(得分:0)

我明白了。

new_structure = []
depth = 0
array.each do |element|
  if element[:depth] == 0
    new_structure << element
  else
    if element[:depth] < depth || element[:depth] == depth
      parent = recursive_method(new_structure[-1], element[:depth] - 1)[:sublevel]
      parent = [] if parent.nil?
      parent << element
    else
      recursive_method(new_structure[-1], element[:depth]).merge!({ sublevel: [element] })
    end
  end
  depth = element[:depth]
end

def recursive_method(structure, depth)
  return structure if structure[:sublevel].nil? || depth == 0
  recursive_method(structure[:sublevel][-1], depth -= 1)
end

结果:

[
  {
    :text => "a",
    :depth => 0,
    :sublevel => [
        {
            :text => "b",
            :depth => 1,
            :sublevel => [
                {
                    :text => "c",
                    :depth => 2
                }
            ]
        }, 
        {
            :text => "d",
            :depth => 1
        }
    ]
  }
]

打开以使其更好。