【发布时间】:2020-05-16 14:40:30
【问题描述】:
我有大型 Json 对象。该对象描述了其组件对象如何分层连接的树型关系。对象知道它的孩子是谁,但不(直接)知道它的父母是谁。下面的“my_hash”举例说明了该结构。每个对象都有一个 id 101、102 等,一个名称“one”、“two”等,它可以有 0、1 或多个子对象。我正在尝试为每个对象构建“路径”。例如。作为代码的结果,对象名称“五”的结果应该具有“/一/二/四”的路径。基本上我正在尝试构建一种对象层次结构的目录结构。
下面的代码可以工作,但它看起来很长,不是很优雅,也不是很Ruby。 对于如何更有效、更优雅地执行此操作的建议,我将不胜感激。而且我有预感,我的代码可能不是很健壮,即很好地处理异常。 任何想法或帮助表示赞赏。
顺便说一句,我只是在学习 Ruby,到目前为止主要使用 Perl 进行编程。
class Tree
def initialize
@my_hash = {
101 => ["one", [102, 107]],
102 => ["two", [103, 104]],
103 => ["three", []],
104 => ["four", [105, 106]],
105 => ["five", []],
106 => ["six", []],
107 => ["seven", [108]],
108 => ["eight", []],
}
@child_to_parent_node = {}
@id_to_name = {}
@my_path_hash = {}
@my_hash.keys.each do |key|
@my_path_hash[key] = ""
end
@parent_path_id = []
end
def map_child_to_parent
@my_hash.each do |key, value|
@id_to_name.store(key, value[0])
node_name, children = value[0], value[1]
children.each do |child_id|
@child_to_parent_node.store(child_id, node_name)
end
end
end
def build_path(id)
parent = @child_to_parent_node[id]
parent.nil? ? return : @parent_path_id << parent
id = @id_to_name.key(parent)
build_path(id)
@parent_path_id
end
def update_tree
@id_to_name.keys.each do |id|
tmp_array = self.build_path(id)
path = ""
if (tmp_array.nil?)
path = "/"
else
tmp_array.reverse.each do
path = path + "/" + tmp_array.pop
end
end
puts "id: #{id} path: #{path}"
end
end
end
my_tree = Tree.new
my_tree.map_child_to_parent
my_tree.update_tree
【问题讨论】:
-
附带说明,代码在“irb”中运行,但导致 vscode 调试器在更新树方法中的“tmp_array = self.build_path(id)”行挂起。我不知道为什么。任何人使用相同的环境并看到相同的问题?
标签: json ruby hash directory-structure