2017-05-05 12 views
0

私はこのような配列のハッシュを持っています、次の形式で:取得する方法すべての可能な組み合わせが

[{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でこれを行う必要がありますどのように?

+0

すべてのキーの配列の長さは同じですか? –

+0

@ Md.FarhanMemonいいえ、それは異なる場合があります。 – pmichna

+0

'h'があなたのハッシュである場合、この質問は配列' h.values'に関するものです。つまり、問題は配列に関するものですが、得られます。 –

答えて

1

基本計画:

空のハッシュを含む配列から開始します。

それぞれのキーと値のペア:配列内の各ハッシュを、各値の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}] 

ための平ら

を繰り返して、列挙方法のよりよいコードと使用してクリーンアップすることでしたが、それはあなたの一般的な考えでなければなりません。

+0

ありがとう! 1つの構文エラー: 'hash.merge({key => value})'でなければなりません。 – pmichna

+0

ああ、私はそれを実行したときに私はその問題に遭遇しましたが、私は古いコードを貼り付けたと思います。 –

2
a = { a: [1, 2], b: [3, 4], c: [5, 6] } 
values = a.values 
values.first.product(*values[1..-1]).map { |e| a.keys.zip(e).to_h } 
#=> [{:a=>1, :b=>3, :c=>5}, {:a=>1, :b=>3, :c=>6}, 
# {:a=>1, :b=>4, :c=>5}, {:a=>1, :b=>4, :c=>6}, 
# {:a=>2, :b=>3, :c=>5}, {:a=>2, :b=>3, :c=>6}, 
# {:a=>2, :b=>4, :c=>5}, {:a=>2, :b=>4, :c=>6}] 

任意のキー数のハッシュで動作します。

関連する問題