ruby如何生成树形结构表单数组?

前端之家收集整理的这篇文章主要介绍了ruby如何生成树形结构表单数组?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我有一个数组,其中包含这样的项目列表
arr = [
  {:id=>1,:title=>"A",:parent_id=>nil},{:id=>2,:title=>"B",{:id=>3,:title=>"A1",:parent_id=>1},{:id=>4,:title=>"A2",{:id=>5,:title=>"A11",:parent_id=>3},{:id=>6,:title=>"12",{:id=>7,:title=>"A2=121",:parent_id=>6},{:id=>8,:title=>"A21",:parent_id=>4},{:id=>9,:title=>"B11",:parent_id=>2},{:id=>10,:title=>"B12",...
]

如果parent_id为nil,那么它应该是父节点,如果parent_id不是nil,则它应该在特定父节点下.

基于id和parent_id,我想提供这样的响应:

-A
  -A1
    -A11
    -A12
      -A123
  -A2
    -A21
-B
  -B1
    -B11
    -B12

我怎么能产生上面提到的回应?

谢谢

解决方法

一个例子:
#!/usr/bin/env ruby

root = {:id => 0,:title => '',:parent_id => nil}

arr = arr = [
  {:id=>1,]

map = {}

arr.each do |e|
  map[e[:id]] = e
end

@@tree = {}

arr.each do |e|
  pid = e[:parent_id]
  if pid == nil || !map.has_key?(pid)
    (@@tree[root] ||= []) << e
  else
    (@@tree[map[pid]] ||= []) << e
  end
end

def print_tree(item,level)
  items = @@tree[item]
  unless items == nil
    indent = level > 0 ? sprintf("%#{level * 2}s"," ") : ""
    items.each do |e|
      puts "#{indent}-#{e[:title]}"
      print_tree(e,level + 1)
    end
  end
end

print_tree(root,0)

输出

-A
  -A1
    -A11
    -12
      -A2=121
  -A2
    -A21
-B
  -B11
  -B12

猜你在找的Ruby相关文章