Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails Rails哈希树到数组_Ruby On Rails_Ruby_Arrays_Hash - Fatal编程技术网

Ruby on rails Rails哈希树到数组

Ruby on rails Rails哈希树到数组,ruby-on-rails,ruby,arrays,hash,Ruby On Rails,Ruby,Arrays,Hash,我正在尝试解析一个大的XML文件。 我用的是萨克斯管 我的哈希有一种树: obj= { "id"=>'1', "groups" =>{ "group" =>[ {"id"=>"2", "groups"=>{}}, {"id"=>"3", "groups"=>{}}, {"id"=>"4", "groups"=>{ "group"=>[ {"id"=>"5", "groups"=&g

我正在尝试解析一个大的XML文件。 我用的是萨克斯管

我的哈希有一种树:

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"}]

有什么想法吗?

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

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

您正在寻找一个非常简单的递归函数,它使树线性化,但也跟踪父级:

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

我已经修改了你的目标,希望它是正确的

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"}]
result=[]
def create_散列(结果、对象、id)
结果“1”,:parent\u id=>0},{:id=>2',:parent\u id=>1},{:id=>3',:parent\u id=>1},{:id=>4',:parent\u id=>1},{:id=>5',:parent\u id=>4},{:id=>6',:parent\u id=>4}]

我已经修改了您的对象,希望它是正确的

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"}]
result=[]
def create_散列(结果、对象、id)
结果“1”,:parent\u id=>0},{:id=>2',:parent\u id=>1},{:id=>3',:parent\u id=>1},{:id=>4',:parent\u id=>1},{:id=>5',:parent\u id=>4},{:id=>6',:parent\u id=>4}]

您的代码格式不正确。请修复它。您的哈希不是有效的ruby代码。您到目前为止尝试的代码是什么?对于DOM/XPath来说是否太大?您的代码格式不正确。请修复它。您的哈希不是有效的ruby代码。您到目前为止尝试过的代码是什么?对于DOM/XPath来说是否太大?