从分层数组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生成平面数组的递归函数[关闭]的主要内容,如果未能解决你的问题,请参考以下文章

在反应中使用递归函数从平面数组创建 JSX 树

将平面数组转换为分层的多维数组

在 Ruby 中从多维数组创建排列

在 Ruby 中从多维数组创建排列

Ruby:应该从子数组返回最大值数组的递归函数的问题

左程云-递归和动态规划