ruby – 从物化路径构建树

ruby – 从物化路径构建树,第1张

概述我在使用 ruby从物化路径构建树结构时遇到了麻烦. 假设我有一个排序结果集(来自couchdb): [ { :key => [], :value => "Home" }, { :key => ["about"], :value => "About" }, { :key => ["services"], :value => "Services" }, { :key => ["ser 我在使用 ruby从物化路径构建树结构时遇到了麻烦.

假设我有一个排序结果集(来自couchdb):

[  { :key => [],:value => "Home" },{ :key => ["about"],:value => "About" },{ :key => ["services"],:value => "Services" },{ :key => ["services","plans"],:value => "Plans" },"training"],:value => "Training" },"training","python"],:value => "Python" },"ruby"],:value => "Ruby" }]

我只需要将它作为ruby中的树,以下哈希就足够了:

{ :Title => "Home",:path => [],:children => [  { :Title => "About",:path => ["about"] },{ :Title => "Services",:path => ["services"],:children => [    { :Title => "Plans",:path => ["services","plans"] }  ]}]}

谁能帮助我?

解决方法 您需要一个简单的帮助类和一点递归:

class Tree  attr_reader :root  def initialize    @root = { :Title => 'Home',:path => [ ],:children => [ ] }  end  def add(p)    r_add(@root,p[:key].dup,p[:value])    self  endprivate  def r_add(h,path,value)    if(path.empty?)      h[:Title] = value       return    end    p = path.shift    c = h[:children].find { |c| c[:path].last == p }     if(!c)      c = { :Title => nil,:path => h[:path].dup.push(p),:children => [ ] }      h[:children].push(c)    end    r_add(c,value)  endend

然后:

t = a.inject(Tree.new) { |t,h| t.add(h) }h = t.root

会在h中给出这个:

{:Title =>"Home",:path=>[],:children=>[  {:Title=>"About",:path=>["about"],:children=>[]},{:Title=>"Services",:path=>["services"],:children=>[    {:Title=>"Plans",:path=>["services",{:Title=>"Training",:children=>[      {:Title=>"Python",{:Title=>"Ruby",:children=>[]}    ]}  ]}]}

你可以理清空:孩子,如果他们重要.

总结

以上是内存溢出为你收集整理的ruby – 从物化路径构建树全部内容,希望文章能够帮你解决ruby – 从物化路径构建树所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/langs/1278574.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-09
下一篇 2022-06-09

发表评论

登录后才能评论

评论列表(0条)

保存