【问题标题】:Ruby On Rails: Convert a path in a string to a recursive HashRuby On Rails:将字符串中的路径转换为递归哈希
【发布时间】:2012-07-13 06:00:30
【问题描述】:

有人可以建议我这样做吗? (一切都在主题中:D)

我想要的是使用“路径”并将其转换为一组子键,

例如:我有那个参数: path = "earth/animal/human/men/young/" value = "martin" 我想要:

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

path = "地球/动物/人类/男人/老人/" value = "John" 我想要:

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

添加另一个

path = "地球/动物/人类/女性/老人/" value = "Eve" 我想要:

`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 文件。

提前致谢

【问题讨论】:

    标签: ruby-on-rails ruby string hash path


    【解决方案1】:
    path = 'earth/animal/human/men/young/'
    value = 'martin'
    path.split('/').reverse.reduce(value){ |r, e| {e.to_sym => r} }
    

    【讨论】:

    • 感谢您的代码非常好,但我们的朋友在您之后发送 cmets 更符合我的需求。你知道以 YML/YAML 格式导出它吗?我用来将 YAML 文件加载到 Hash var 接缝中的 YAML 模块没有允许我们执行相反过程的功能。
    【解决方案2】:

    函数递归方法:

    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"}}}
    

    【讨论】:

    • 感谢您提供的代码行,这非常有帮助您知道以 YML/YAML 格式导出它吗?我用来将 YAML 文件加载到 Hash var 接缝中的 YAML 模块没有允许我们执行相反过程的功能。
    • > YAML.dump({:a => 1}) => "---\n:a: 1\n"
    猜你喜欢
    • 2014-05-14
    • 2010-11-05
    • 2017-01-07
    • 1970-01-01
    • 2017-06-02
    • 2014-04-30
    • 2015-04-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多