检查此Ruby convert array to nested hash和其他网站后,我无法实现以下转换:
我有这个:
{"a"=>"text"}
{"b"=>{"x"=>"hola"}}
{"b"=>{"y"=>"pto"}
}
我希望获得:
{"a"=>text,
b=>{"x" => "hola",
"y" => "pto"
}
}
到目前为止,代码似乎是这样的:
tm =[[["a"],"text"],[["b","x"],"hola"],[["b","y"],"pto"]]
q = {}
tm.each do |l|
q = l[0].reverse.inject(l[1]) { |p, n| { n => p } }
i += 1
end
我尝试使用merge
,但它会覆盖键!我也尝试了这个How can I merge two hashes without overwritten duplicate keys in Ruby?,但它会一直覆盖。
更新
如何为未定义的嵌套哈希(级别)执行此操作? hash[key1][key2][key3]... = "value"
{"a"=>"text"},
{"b"=>{"x"=>"hola"},
{"b"=>{"y"=>"pto"},
{"c"=>{"g"=>{"k" => "test1"}},
...
}
答案 0 :(得分:1)
对于Rails,ActiveSupport
的{{3}}函数完全符合您的要求。
您可以按照以下方式自行实现:
class ::Hash
def deep_merge(second)
merger = proc { |key, v1, v2| Hash === v1 && Hash === v2 ? v1.merge(v2, &merger) : v2 }
self.merge(second, &merger)
end
end
现在,
h1 = {"a"=>"text"}
h2 = {"b"=>{"x"=>"hola"}}
h3 = {"b"=>{"y"=>"pto"}}
h1.deep_merge(h2).deep_merge(h3)
# => {"a"=>"text", "b"=>{"x"=>"hola", "y"=>"pto"}}
答案 1 :(得分:0)
您可以将merge
与块一起使用来告诉Ruby如何处理重复键:
a = {"a"=>"text"}
b = {"b"=>{"x"=>"hola"}}
c = {"b"=>{"y"=>"pto"}}
a.merge(b).merge(c) { |key, left, right| left.merge(right) }
#=> {"a"=>"text", "b"=>{"x"=>"hola", "y"=>"pto"}}