2016-06-20 5 views
-1

私はこのようなハッシュを持っている: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] ... ] 

それははるかに、書き込み理解し、簡単なブロックを読みやすくなりますように私は、実際のコードでそれを使用されることはありませんしかし、好奇心のために。それを行うための非常にルビー的な方法は何ですか、必要に応じてパフォーマンスの問題を無視してください。

+1

あなたの例でハッシュが 'H'がコンパイルされない、と同じ理由で、あなたの期待出力も達成可能ではありません - あなたは、変数名が値として表示することはできません配列で。私はその理由のためにdownvotingです、あなたが@ Ruby –

+1

Ditto on @ Wandのコメントである例を提供できるなら、私はdownvoteを削除します。明確にするために、Wandが "...配列の値"と言う場所。彼は「価値観」を意味していない。彼は鍵を指している。例えば、「タイプ」はおそらく値が未知の変数またはメソッドである。おそらく、 ':type1'や' 'type1" 'のようなリテラルであることを意味します。 –

+0

ようこそスタックオーバーフロー。 SOは私のサイト用のコードではなく、コードのデバッグに役立ちます。リンクされたページと "[mcve]"を含む "[ask]"をお読みください。あなたの質問は非常に幅広く、問題のコーディングや調査に何の努力もしていません。 –

答えて

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 
+0

私は何とかh.valuesとh.keysを使用できません –

+0

この答えで何が起きているのですか?これを使用したくない理由がありますか? –

+2

これは、配列の配列の配列を生成します。配列の配列が望ましい。それで、他の答えは 'map'ではなく' flat_map'を使う理由です。 –

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

編集:それは@max pleanerの答えと同じであることに気付きました。

Edit2:いいえ、そうではありませんでした。ここで

3

は、これを行うためのもう一つの方法です:

h.flat_map {|k, v| [k].product v} 
関連する問題