我有两个哈希:
h1 = {'a' => 33, 'b' => 4, 'c' => 6}
h2 = {'d' => 10, 'e' => 1, 'f' => 12}
现在它们应该交替合并为一个,所以最终的哈希应该是这样的:
{'a' => 33, 'd' => 10, 'b' => 4, 'e' = 1, 'c' => 6, 'f' => 12}
最好的方法是什么。应该是单排吧?
谢谢!
这是我的尝试
Hash[*[h1.to_a, h2.to_a].transpose.flatten]
# => {"a"=>33, "d"=>10, "b"=>4, "e"=>1, "c"=>6, "f"=>12}
# or
Hash[*h1.to_a.zip(h2.to_a).flatten]
# => {"a"=>33, "d"=>10, "b"=>4, "e"=>1, "c"=>6, "f"=>12}
即使有更多的明星。:-)
Hash[*[*h1, *h2].transpose.flatten]
# => {"a"=>"b", "c"=>"d", "e"=>"f", 33=>4, 6=>10, 1=>12}
没有星星!
h1 = {'a' => 33, 'b' => 4, 'c' => 6}
h2 = {'d' => 10, 'e' => 1, 'f' => 12}
h1.to_a.zip(h2.to_a).flatten(1).to_h
#=> {"a"=>33, "d"=>10, "b"=>4, "e"=>1, "c"=>6, "f"=>12}
对于 Ruby 版本 < 2.0:
Hash[h1.to_a.zip(h2.to_a).flatten(1)]
注意Array#transpose和Enumerable#zip在操作数组时总是可以互换的。
对于 < 1.9 的 Ruby 版本,未指定散列中键/值对的顺序。对于这些版本,您最接近回答问题的方法是提供所需的键顺序:
keys_in_order = ['a', 'd', 'b', 'e', 'c', 'f']
检索关联的值:
values = h1.merge(h2).values_at(*keys_in_order)
#=> [33, 10, 4, 1, 6, 12]
并将它们与zip
:
keys_in_order.zip(values)
#=> [["a", 33], ["d", 10], ["b", 4], ["e", 1], ["c", 6], ["f", 12]]