0

我有两个哈希:

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}

最好的方法是什么。应该是单排吧?

谢谢!

4

2 回答 2

3

这是我的尝试

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}
于 2014-07-24T19:16:52.677 回答
3

没有星星!

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#transposeEnumerable#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]]
于 2014-07-24T19:44:29.310 回答