Rails哈希树到数组

时间:2014-06-02 10:23:20

标签: ruby-on-rails ruby arrays hash

我试图解析一个大型XML文件。 我使用的是Saxerator。

我的哈希有一种树:

obj= {
  "id"=>'1', "groups" =>{
  "group" =>[
   {"id"=>"2", "groups"=>{}},
   {"id"=>"3", "groups"=>{}},
   {"id"=>"4", "groups"=>{
     "group"=>[
       {"id"=>"5", "groups"=>{}},
       {"id"=>"6", "groups"=>{}},
     ]}}
]}}

我事先并不知道树的深度。 我有一个问题。我不知道如何在数组中转换它。 结果应该是这样的:

[{"id"=> "1", "parent_id"=> "0"},
{"id"=> "2", "parent_id"=> "1"},
{"id"=> "3", "parent_id"=> "1"},
{"id"=> "4", "parent_id"=> "1"},
{"id"=> "5", "parent_id"=> "4"},
{"id"=> "6", "parent_id"=> "4"}]

有任何想法吗?

2 个答案:

答案 0 :(得分:5)

您正在寻找一个非常简单的递归函数,它可以对树进行线性化处理,但也可以跟踪父级:

def tree_to_a(tree, p = 0)
  id = tree["id"]
  (tree["groups"]["group"] || [])
    .flat_map { |sub| tree_to_a(sub, id) }
    .unshift("id" => id, "parent_id" => p)
end

答案 1 :(得分:1)

我修改了你的对象我希望它是正确的。

obj= {
  "id"=>'1', "groups" =>{
  "group" =>[
   {"id"=>"2", "groups"=>{}},
   {"id"=>"3", "groups"=>{}},
   {"id"=>"4", "groups"=>{
     "group"=>[
       {"id"=>"5", "groups"=>{}},
       {"id"=>"6", "groups"=>{}},
     ]}}
]}}

然后这是你的解决方案。

result = []
def create_hash(result, obj, id)
  result << {id: obj['id'], parent_id: id}
  if obj['groups']['group']
    obj['groups']['group'].each do |g|
      create_hash(result, g, obj['id'])
    end
  end
end
create_hash(result, obj, 0)
result // [{:id=>"1", :parent_id=>0}, {:id=>"2", :parent_id=>"1"}, {:id=>"3", :parent_id=>"1"}, {:id=>"4", :parent_id=>"1"}, {:id=>"5", :parent_id=>"4"}, {:id=>"6", :parent_id=>"4"}]