3

ビュースクリプトに、配列の配列を反復処理するコードがあります。

<% @rows.each do |data| %>
  <%= data[0] %>: <%= data[1] %><br>
<% end %>

dataキーで各アイテムを参照できるように、各配列をハッシュに簡単に変換するにはどうすればよいですか?

<%= data[:name] %>: <%= data[:email] %><br>
4

3 に答える 3

4

次のような名前付きの値を持つ配列を参照できます。

<% @rows.each do |name,email| %>
  <%= name %>: <%= email %><br />
<% end %>

@rowsこれは、配列のすべてのメンバーが期待される2値配列になることを前提としています。

于 2012-10-18T16:36:33.840 に答える
2

@Zachの答えは大丈夫ですが、あなたが求めたものに厳密に答えると、次のように行うことができます。

@rows2 = @rows.map { |row| Hash[[:name, :email].zip(row)] }
于 2012-10-18T16:43:38.253 に答える
2

@Zachと@toklandは2つの素晴らしい答えを提供しました。プリミティブなハッシュと配列の構成に依存するのではなく、ファーストクラスのデータオブジェクトを作成すると便利な場合があります。 Structこれには便利です:

irb> EmailTuple = Struct.new :name, :email
=> EmailTuple
irb> rows = [%w{foo foo@example.com}, %w{bar bar@example.com}]
=> [["foo", "foo@example.com"], ["bar", "bar@example.com"]]
irb> rows2 = rows.map{ |row| EmailTuple[ *row ] }
=> [#<struct EmailTuple name="foo", email="foo@example.com">, #<struct EmailTuple name="bar", email="bar@example.com">]
irb> rows2.map{ |tuple| "#{tuple.name} has email #{tuple.email}" }
=> ["foo has email foo@example.com", "bar has email bar@example.com"]
于 2012-10-18T23:44:39.477 に答える