2012-05-21 67 views
0

我有存儲在@colors實例變量解析的數據的JSON文件,如下所示:JSON解析成Ruby的迭代器

[{:color=>"red", :value=>"#f00"} {:color=>"green", :value=>"#0f0"} {:color=>"blue", :value=>"#00f"} {:color=>"cyan", :value=>"#0ff"} {:color=>"magenta", :value=>"#f0f"} {:color=>"yellow", :value=>"#ff0"} {:color=>"black", :value=>"#000"}] 

現在我想通過這個輸出迭代的圖,其中創建一個表有

<tr><td>color</td><td>value</td></tr> 

當我得到這樣的另一個實例變量 -

@even_colors = @colors.values_at(* @colors.each_index.select {|i| i.even?}).map(&:values) 

我得到的AR數組由每一個其他顏色/值對射線

[["red", "#f00"], ["blue", "#00f"], ["magenta", "#f0f"], ["black", "#000"]] 

但我想創建兩個單獨的陣列,一個僅由所指示的顏色名稱:顏色(紅色,藍色等),而另一個包括只是由值指示的十六進制(#f00,#00f等)。我似乎無法弄清楚如何做到這一點。任何人有任何建議?與通

names = @colors.map { |h| h[:color] } 
hexes = @colors.map { |h| h[:value] } 

,或者你可以它:謝謝...

回答

2

您可以用兩道不必通過@colors

parts = @colors.each_with_object({ :names => [ ], :hexes => [ ]}) do |h, parts| 
    parts[:names].push(h[:color]) 
    parts[:hexes].push(h[:value]) 
end 

再看看parts[:names]的顏色名稱和parts[:hexes]爲十六進制值。

我真的不明白爲什麼要拆分雖然高達@colors,你可以從@colors直接出示你的表:

<table> 
    <% @colors.each do |h| %> 
     <tr><td><%= h[:color] %></td><td><%= h[:value] %></td></tr> 
    <% end %> 
</table> 

打破@colors成兩個陣列好像繁忙的工作給我。

+0

謝謝!你是對的,我不需要兩個數組。你的第二個建議完美運作。我在看到這個語法之前我想我還沒有內化它! – drollwit