从分层数组Ruby生成平面数组的递归函数[关闭]
Posted
技术标签:
【中文标题】从分层数组Ruby生成平面数组的递归函数[关闭]【英文标题】:Recursive function to generate flat array from hierarchical array Ruby [closed] 【发布时间】:2014-04-07 15:41:25 【问题描述】:我有一个这样的 ruby 哈希数组
string = "[\"id\":13,\"id\":15,\"children\":[\"id\":16,\"id\":17,\"children\":[\"id\":19],\"id\":18],\"id\":14]"
hash = Json.parse(string)
我正在尝试创建一个 ruby 哈希数组,例如:
13=>nil, 15=>nil, 16=>15, 17=>15, 19=>17, 18=>15, 14=>nil
【问题讨论】:
你有什么问题? 没有像Json.parse(string)
这样的东西,但 JSON.parse(string)
确实有效..Json.parse(string)
会抛出错误。
我不明白您的起始字符串/数组如何映射到您的结果。为什么 13 => nil 但 17 => 15?我在源字符串中根本看不到。
【参考方案1】:
这样就可以了:
def build_hash(arr, hash=, parent=nil)
return if arr.nil?
arr.each do |item|
hash[item['id']] = parent
build_hash(item['children'], hash, item['id'])
end
hash
end
build_hash(hash)
# => 13=>nil, 15=>nil, 16=>15, 17=>15, 19=>17, 18=>15, 14=>nil
【讨论】:
【参考方案2】:我刚刚看到 Uri 发布了他的解决方案,我刚刚完成我的解决方案。我的工作在一个哈希上,而他在一个数组上工作(你的输入实际上是一个哈希数组,而不是一个哈希)。否则它们大致相同。我更喜欢他的,但为了多样化:
@output =
def process(hash, parent=nil)
id = hash['id']
children = hash['children']
@output[id] = parent
children.each |child| process(child, id) unless children.nil?
end
hash.each |h| process(h)
p @output
# => 13=>nil, 15=>nil, 16=>15, 17=>15, 19=>17, 18=>15, 14=>nil
【讨论】:
OP 没有说它是一个哈希。他们说这是一个哈希数组。基于数组,我还提出了与 Uri 几乎相同的答案,但没有发布它,因为那将是多余的。在这种情况下,当您查看["children"]
的值时,将其视为一个数组会更好。由于您使用哈希进行此操作,因此您需要独立于方法调用 hash.each
。
@sawa 好吧,假设他有点自相矛盾,因为他将变量命名为存储哈希数组的变量,hash
:-)
我同意这是误导性的(尽管并不矛盾)。我还注意到,当它只是一个哈希时,OP 甚至将预期结果称为哈希数组。这是错误的。以上是关于从分层数组Ruby生成平面数组的递归函数[关闭]的主要内容,如果未能解决你的问题,请参考以下文章