ruby 中哈希值的笛卡尔积

Cartesian product from hash values in ruby

假设我们有这样一个哈希结构 {:s=>[1, 2, 3], :c=>["r", "g", "b" ]},在这种情况下,我们如何计算键值的笛卡尔积。哈希中键值对的数量本质上是动态的,可能会有所不同。任何帮助将不胜感激.....

   h = { a: [1, 2, 3], b: [:d, :e, :f], c: ["g", "h", "i"] }

   first, *rest = h.values
   first.product(*rest)
     #=> [[1, :d, "g"], [1, :d, "h"], [1, :d, "i"], [1, :e, "g"],
     #    [1, :e, "h"], [1, :e, "i"], [1, :f, "g"], [1, :f, "h"],
     #    [1, :f, "i"], [2, :d, "g"], [2, :d, "h"], [2, :d, "i"],
     #    [2, :e, "g"], [2, :e, "h"], [2, :e, "i"], [2, :f, "g"],
     #    [2, :f, "h"], [2, :f, "i"], [3, :d, "g"], [3, :d, "h"],
     #    [3, :d, "i"], [3, :e, "g"], [3, :e, "h"], [3, :e, "i"],
     #    [3, :f, "g"], [3, :f, "h"], [3, :f, "i"]]

参见Array#product

或者,可以这样写:

values = h.values
values.shift.product(*values)