0

ネストされたハッシュがあります:

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

どうすればいいのかわかりません。誰か助けてもらえますか?

4

2 に答える 2

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
于 2012-11-22T16:07:22.307 に答える
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")ます。

于 2012-11-22T16:22:42.490 に答える