ruby 。合并嵌套哈希而不覆盖

标签 ruby hash merge nested

我有一个嵌套哈希:

{
  ["X", 1, 2, 3]=> {
    ["X", "O", 2, 3]=> {
      ["X", "O", "X", 3]=>["X", "O", "X", "O"]
    }
  }
}

我想合并给定的嵌套哈希:

{
  ["X", 1, 2, 3]=> {
    ["X", "O", 2, 3]=> {
      ["X", "O", 2, "X"] => ["X", "O", "O", "X"]
    }
  }
}

这样:

{
  ["X", 1, 2, 3]=> {
    ["X", "O", 2, 3]=> {
      ["X", "O", "X", 3]=>["X", "O", "X", "O"],
      ["X", "O", 2, "X"] => ["X", "O", "O", "X"]
    }
  }
}

最好的方法是什么?

我要合并的散列将在任意嵌套深度处具有等效键。最后一个嵌套哈希的值始终与所有其他哈希不同。

最佳答案

如果您确定所有重复键的值都是哈希值,则可以使用递归 Hash#merge带 block :

def deep_merge(h1,h2)
  h1.merge(h2){|k,v1,v2| deep_merge(v1,v2) }
end

以你的例子:

{["X", 1, 2, 3]=>
  {["X", "O", 2, 3]=>
    {["X", "O", "X", 3]=>["X", "O", "X", "O"],
     ["X", "O", 2, "X"]=>["X", "O", "O", "X"]}}}

注意:此方法在一般情况下不起作用,并且不应用于问题中定义的结构以外的任何其他情况。 deep_merge({a:1},{a:2}) 将会失败。

如果您没有有关嵌套键和值的信息:

def deep_merge(h1,h2)
  h1.merge(h2){|k,v1,v2| v1.is_a?(Hash) && v2.is_a?(Hash) ? deep_merge(v1,v2) : v2}
end

如果与不是两个哈希值的值发生冲突,第二个值将覆盖第一个值。

这两种方法都会返回一个新的哈希值,并且不会修改 h1 或 h2。

注意:此方法可在 Rails 中找到。 .

关于 ruby 。合并嵌套哈希而不覆盖,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41109599/

相关文章:

ios - 'pod init' 返回:不允许操作 - getcwd (Errno::EPERM)

ruby - 使用 Pony Gem 在 Ruby 中发送带有附件的电子邮件

ruby-on-rails - bundle 更新卡住

java - 两个键如何在哈希中产生相同的值?

ruby-on-rails - ruby 哈希 : can't convert String into Integer

pandas:merge/concat.join 两个 dfs

ruby-on-rails - 让 Rails #destroy_all 运行得更快

Perl根据某个键连接2个散列

git - 避免在 git 中 merge 提交

r - 如何根据 df1 中的开始日期和结束日期使用 df2 中变量的总和在 df1 中创建新变量?