0

次のように、 @colors インスタンス変数に保存された解析済みデータを含む JSON ファイルがあります。

[{: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)

他のすべての色/値のペアで構成される配列の配列を取得します

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

しかし、2 つの別個の配列を作成したいのですが、1 つは :color (赤、青など) で示される色の名前のみで構成され、もう 1 つは :value (#f00、#00f など) で示される 16 進数のみで構成されます。 )。私はそれを行う方法を理解できないようです。誰にも提案はありますか?ありがとう ...

4

1 に答える 1

2

あなたは2つのパススルーでそれを行うことができます@colors:

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

または、パスでそれを行うことができます:

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]16 進値を調べます。

分割したい理由がよくわかりませんが@colors、から直接テーブルを作成できます@colors

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

2 つの配列@colorsに分割することは、私には忙しい仕事のように思えます。

于 2012-05-21T05:10:00.980 に答える