多个数组的排列

时间:2018-09-19 16:51:01

标签: ruby

目前,我可以得到两个项目数组的所有排列,如下所示:

[[:a, :b], [:c, :d]].reduce(&:product)
# => [[:a, :c], [:a, :d], [:b, :c], [:b, :d]]

但是,当我尝试对三项数组执行相同操作时,却没有得到期望的结果:

[[:a, :b], [:c, :d], [:e, :f]].reduce(&:product)
# => [[[:a, :c], :e], [[:a, :c], :f], [[:a, :d], :e], [[:a, :d], :f]]

预期结果是:

[[:a, :c, :e], [:a, :c, :f], [:a, :d, :e], [:a, :d, :f] ...]

2 个答案:

答案 0 :(得分:3)

data = [[:a, :b], [:c, :d], [:e, :f]]
data[0].product(*data[1..-1])
# => [[:a, :c, :e], [:a, :c, :f], [:a, :d, :e], [:a, :d, :f], [:b, :c, :e], [:b, :c, :f], [:b, :d, :e], [:b, :d, :f]]

您可以使用更多数组扩展数据

答案 1 :(得分:0)

由于每个项目(例如[[:a, :c], :e]都是正确的,因此可以展平:

[[:a, :b], [:c, :d], [:e, :f]].reduce(&:product).map(&:flatten)
# => [[:a, :c, :e], [:a, :c, :f], [:a, :d, :e], [:a, :d, :f] ...]