2016-06-20 9 views
-1

Ich habe Hash wie folgt aus:Ruby, Kürzeste Möglichkeit, Schlüssel, Wertpaar aus Hash zu erstellen?

h = { 
    type1: [1,2,3,4], 
    type2: [1,2,3,4], 
    type3: [1,2,3,4] 
} 

I Ausgabe so wollen:

[[:type1,1],[:type1,2],[:type1,3],[:type1,4],[:type2,1],[:type2,2] ... ] 

Ich werde es nicht in eigentlichen Code verwenden, da es viel einfacher zu schreiben ist, zu verstehen und einfach Block gelesen Aussage, aber aus Neugier. Was ist der sehr rubinistische Weg, dies zu tun, abgesehen von irgendwelchen Leistungsbedenken, wenn es sein muss.

+1

Ihr Beispiel Hash 'H' nicht kompiliert, und aus demselben Grund Ihre erwartete Ausgabe ist auch nicht erreichbar - nicht Variablennamen als Werte angezeigt haben im Array. Ich werde aus diesem Grund downvoting, ich werde den Downvote entfernen, wenn Sie Beispiel, das richtige Ruby –

+1

Ditto on @ Wands Kommentar bereitstellen kann. Um zu klären, wo Wand sagt "... Werte in Array." Er bezieht sich nicht auf "Werte" im Sinne von "Schlüsselwert". Er bezieht sich auf die Schlüssel; z.B. ist "Typ" vermutlich eine Variable oder Methode, deren Wert unbekannt ist. Vielleicht meinen Sie, dass es ein Literal ist wie ': type1' oder' type1'. –

+0

Willkommen bei Stack Overflow. SO ist kein Schreibcode für mich Website, stattdessen helfen wir Ihnen, Ihren Code zu debuggen. Bitte lesen Sie "[fragen]" einschließlich der verlinkten Seiten und "[mcve]". Ihre Frage ist sehr weit gefasst und zeigt keinerlei Aufwand bei der Kodierung oder Erforschung des Problems. –

Antwort

0

können Sie eine verschachtelte Karte verwenden:

h.map do |key, array_value| 
    array_value.map do |item| 
    [key, item] 
    end 
end 

Verbrauch:

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> 

Um mit keys und values Verfahren das gleiche zu tun, so gut ich weiß:

result = [] 
h.values.each_with_index do |array, idx| 
    array.each do |item| 
    result[h[h.keys[idx]]] = item 
    end 
end 
+0

kann ich nicht h.keys mit h.values ​​irgendwie verwenden –

+0

Das ist was passiert in dieser Antwort. Gibt es einen Grund, warum du das nicht benutzen willst? –

+2

Dies erzeugt ein Array von Arrays von Arrays. Ein Array von Arrays ist erwünscht. Deshalb verwenden die anderen Antworten "flat_map" anstatt "map". –

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

Edit: Ich habe festgestellt, dass es sich um die Antwort von @max pleaner handelt.

Edit2: Nein, war es nicht.

3

Hier ist eine weitere Möglichkeit, dies zu tun:

h.flat_map {|k, v| [k].product v} 
Verwandte Themen