我有一个像这样的数组散列:
{a: [1, 2], b: [3, 4]}
我正在尝试构建一个数组,其中包含所有可能的值组合,每个组合来自不同的键值对,格式如下:
[{a: 1, b: 3}, {a: 1, b: 4}, {a: 2, b: 3}, {a: 2, b: 4}]
散列可以有n
键,每个都可以有m
值——我不能假设任何数字。每个值(数组)可以有不同的大小。以下也是有效的输入:
{a: [1, 2, 3], b: [4, 5, 6, 7], c: [8, 9, 10, 11, 12]}
我得到的最好的是一个包含所有值排列但没有键的数组:
a = {a:[1, 2, 3], b: [4, 5, 6], c: [7, 8, 9]}
a.reduce([]) { |acc, (k, v)| acc.empty? ? v : acc.product(v) }.map(&:flatten)
=> [[1, 4, 7], [1, 4, 8], [1, 4, 9], [1, 5, 7], [1, 5, 8], [1, 5, 9], [1, 6, 7], [1, 6, 8], [1, 6, 9], [2, 4, 7], [2, 4, 8], [2, 4, 9], [2, 5, 7], [2, 5, 8], [2, 5, 9], [2, 6, 7], [2, 6, 8], [2, 6, 9], [3, 4, 7], [3, 4, 8], [3, 4, 9], [3, 5, 7], [3, 5, 8], [3, 5, 9], [3, 6, 7], [3, 6, 8], [3, 6, 9]]
我应该如何在 Ruby 中做到这一点?
基本计划:
从一个包含空散列的数组开始。
每个键值对:将数组中的每个哈希映射到hash.merge({key=> value})
每个值的数组。压平
对每个键重复
hash = {a: [1, 2], b: [3, 4]}
array = [{}]
hash.each_pair do |key, values|
array.map! do |hash|
values.map do |value|
hash.merge({key=> value})
end
end.flatten!
end
array
=> [{:a=>1, :b=>3}, {:a=>1, :b=>4}, {:a=>2, :b=>3}, {:a=>2, :b=>4}]
可以用更好的代码和可枚举方法的使用来清理,但这应该是你的一般想法。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句