我有一个嵌套哈希:
{
["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/