加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-17 04:29:19 所属栏目:百科 来源:网络整理
导读:我有一个数组,其中包含这样的项目列表 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},{
我有一个数组,其中包含这样的项目列表
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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读