2012-07-13 84 views
2

有人能够建议我一种方法来做到这一点吗? (全部是在主题:d)Ruby On Rails:将字符串中的路径转换为递归哈希

我想要使用“路径”,并变换分析它的子键的西装,

例如:我有一个PARAMS:PATH = “地球/动物/人/人/青年/” 值= “马丁” ,我想:

`Global_hash = { earth => { human => { men => { young => "martin" 
               } 
             } 
          } 
       }` 

路径=“地球/动物/人/人/老/ “VALUE = ”约翰“ ,我想:

Global_hash = { earth => { human => { men => { young => "martin", 
               old => "John" 
             } 
           } 
        } 
      } 

添加其他

路径= ”地球/动物/人/女/老/“ 值= ”夏娃“ ,我想:

`Global_hash = { earth => { human => { men => { young => "martin", 
                old  => "John" 
               }, 
             women => { old => "Eve" 
               } 
            } 
          } 
       } 

`

的最终目标是产生具有2个参数YML文件的方式: 路径和值

的为例生产: '

earth: 
    animal: 
    human: 
     men:  
     young: "martin" 
     old: "John" 
     women: 
     old: "Eve" 

` 它将允许我们有一个yml文件,其中包含所有对象,由于它们的路径而被分段排序。每提前

感谢

回答

5
path = 'earth/animal/human/men/young/' 
value = 'martin' 
path.split('/').reverse.reduce(value){ |r, e| {e.to_sym => r} } 
+0

感谢你的代码是很不错,但我们的朋友,谁后,你发的评论更适合我的需要。 你有任何想法导出它在YML/YAML格式? YAML模块用于将YAML文件加载到Hash var接口中,使其不具有允许我们执行相反过程的功能。 – user1523335 2012-07-15 16:03:15

1

功能递归方法:

def insert(hash, path, value) 
    head, *tail = path 
    if tail.empty? 
    hash.merge(head => value) 
    else 
    h = insert(hash[head] || {}, tail, value) 
    hash.merge(head => hash.has_key?(head) ? hash[head].merge(h) : h) 
    end 
end 

h1 = insert({}, "animal/human/women/old".split("/"), "Eve") 
# {"animal"=>{"human"=>{"women"=>{"old"=>"Eve"}}}} 

h2 = insert(h1, "animal/human/men/old".split("/"), "Adam") 
# {"animal"=>{"human"=>{"women"=>{"old"=>"Eve"}, 
#      "men"=>{"old"=>"Adam"}}}} 

h3 = insert(h2, "animal/chimpanzee/smart".split("/"), "Caesar") 
# {"animal"=>{"human"=>{"women"=>{"old"=>"Eve"}, 
#      "men"=>{"old"=>"Adam"}}, 
#    "chimpanzee"=>{"smart"=>"Caesar"}}} 
+0

感谢代码行,这是非常有用的 你有任何想法导出它在YML/YAML格式? YAML模块我用来将YAML文件加载到Hash var接缝中,使其没有允许我们执行相反过程的功能。 – user1523335 2012-07-15 15:58:32

+0

> YAML.dump({:a => 1}) =>“--- \ n:a:1 \ n” – tokland 2012-07-15 18:18:29

相关问题