Ruby,最简单的方法来创建哈希值Key,值对吗?

时间:2016-06-20 18:24:13

标签: ruby

我有这样的哈希:

h = {
   type1: [1,2,3,4],
   type2: [1,2,3,4],
   type3: [1,2,3,4]
}

我想要这样的输出:

[[:type1,1],[:type1,2],[:type1,3],[:type1,4],[:type2,1],[:type2,2] ... ]

我不会在实际代码中使用它,因为它更容易编写,理解和阅读简单的块语句,但出于好奇的缘故。什么是非常红宝石的方式,如果需要,无视任何性能问题。

3 个答案:

答案 0 :(得分:3)

以下是另一种方法:

h.flat_map {|k, v| [k].product v}

答案 1 :(得分:2)

h.flat_map{|k, a| a.map{|v| [k, v]}}

编辑:我意识到它与@max pleaner的答案相同。

Edit2:不,不是。

答案 2 :(得分:0)

您可以使用嵌套地图:

h.map do |key, array_value|
  array_value.map do |item|
    [key, item]
  end
end

用法:

irb(main):009:0> h = { a: [1,2,3], b: [4,5,6] }
=> {:a=>[1, 2, 3], :b=>[4, 5, 6]}
irb(main):010:0> h.map do |key, array_value|
irb(main):011:1*   array_value.map do |item|
irb(main):012:2*     [key, item]
irb(main):013:2>   end
irb(main):014:1> end
=> [[[:a, 1], [:a, 2], [:a, 3]], [[:b, 4], [:b, 5], [:b, 6]]]
irb(main):015:0> 

我最了解keysvalues方法做同样的事情:

result = []
h.values.each_with_index do |array, idx|
  array.each do |item|
    result[h[h.keys[idx]]] = item
  end
end