如何为嵌套哈希添加值?

时间:2012-11-22 16:03:07

标签: ruby hash

我有一个嵌套哈希:

hash = {
  "a" => "a",
  "b" => {
    "c" => "c",
    "d" => {
      "e" => "e"
    }
  }
}

我有一个哈希:

new_value = {
  "b.d.e" => "new value"
}

我需要某种“魔法”函数来替换hash["b"]["d"]["e"]处的哈希值,例如:

magical_function(hash, new_value)
#=> hash = {
      "a" => "a",
      "b" => {
        "c" => "c",
        "d" => {
          "e" => "new value"
        }
      }
    }

我不知道怎么做。有人可以帮忙吗?

2 个答案:

答案 0 :(得分:6)

如果以直接的方式实施它并不神奇:

merge_hash.each do |key, value|
  parts = key.split('.')
  leaf = parts.pop

  target = parts.inject(hash) do |h, k|
    h[k] ||= { }
  end

  target[leaf] = value
end

答案 1 :(得分:1)

这是另一种解决方案:

class Hash
  def replace_value(*keys, value)
    current = self
    current = current[keys.shift] while keys.size > 1
    current[keys.last] = value
  end
end

通过调用hash.replace_value("b","d","e", "new_value")来调用。