Ruby:将数组转换为带有命名键的哈希的最简单方法?

时间:2012-10-18 16:14:48

标签: ruby

我在视图脚本中有一些代码,它遍历数组数组:

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

如何轻松地将每个data数组转换为哈希值,以便我可以使用键引用每个项目?

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

3 个答案:

答案 0 :(得分:4)

您可以使用如下命名值来引用数组:

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

这假设@rows数组的每个成员都是预期的双值数组。

答案 1 :(得分:2)

@Zach的答案还可以,但严格回答你的要求,可以这样做:

@rows2 = @rows.map { |row| Hash[[:name, :email].zip(row)] }

答案 2 :(得分:2)

@Zach和@tokland提供了两个很好的答案。有时制作第一类数据对象而不依赖于原始哈希和数组的组合是很好的。 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"]