2015-09-18 110 views
0

我怎樣才能從具有陣列領域這樣一個哈希創建兩個或多個新的哈希值:根據哈希Ruby中的數組數據將哈希分解爲重複哈希?

{carStyle: "truck", make: ["Ford","Toyota"], model:["Ranger", "Tacoma"]} 

所以我想那出來是這樣的兩個新的哈希值:

{carStyle: "truck", make: "Ford", model: "Ranger"} 
{carStyle: "truck", make: "Toyota", model: "Tacoma"} 

我想知道是否有一種方法來使用地圖和收集來實現這一目標?或者如果有人看到類似的問題,他們可以指出我可能錯過了。

在此先感謝!

+0

'carStyle'總是隻有一個值,而'make'和'model'具有相同的數量和相應的順序,所以第一個make和第一個模型一起使用? –

+0

對這兩個問題都是有效的 – jverbe

+0

舉例時,將所有輸入對象分配給變量(例如'h = {carStyle:...}')是有幫助的。這樣,可以在評論和答案中對這些變量進行引用,而無需對其進行定義。 –

回答

1
data = {carStyle: "truck", make: ["Ford","Toyota"], model:["Ranger", "Tacoma"]} 
data[:make].zip(data[:model]).map{|x| 
    { carStyle: data[:carStyle], make: x[0], model: x[1] } 
} 

馬克·裏德提出更好的解決方案:

data[:make].zip(data[:model]).map{|x,y| 
    { carStyle: data[:carStyle], make: x, model: y } 
} 
+2

我喜歡它。你也可以......'map {| x,y | {... make:x,model:y}}'並避免索引。 –

+0

謝謝,@MarkReed,我也會加你的回答 – dimakura

+0

謝謝你們倆!這完美的作品,讓我朝着正確的方向 – jverbe

1
h = {carStyle: "truck", make: ["Ford","Toyota"], model: ["Ranger", "Tacoma"]} 

style, makes, models = h.values_at(:carStyle, :make, :model) 
    # => ["truck", ["Ford", "Toyota"], ["Ranger", "Tacoma"]] 

makes.zip(models).map {|make, model| {carStyle: style, make: make, model: model}} 
    #=> [{:carStyle=>"truck", :make=>"Ford", :model=>"Ranger"}, 
    # {:carStyle=>"truck", :make=>"Toyota", :model=>"Tacoma"}] 

我已經添加了局部變量,以提高可讀性。

+0

1額外的代碼行增加可讀性是非常值得的。 – engineersmnky