Подтвердить что ты не робот

Ruby объединяет два массива в один

Вот моя ситуация. У меня есть 2 массива

@names = ["Tom", "Harry", "John"]

@emails = ["[email protected]", "[email protected]", "[email protected]"]

Я хочу объединить эти два в некоторый Array/Hash под названием @list, чтобы затем повторить в моем представлении что-то вроде этого:

<% @list.each do |item| %>
<%= item.name %><br>
<%= item.email %><br>
<% end %>

У меня возникли проблемы с пониманием того, как я могу достичь этой цели. Любые мысли?

4b9b3361

Ответ 1

@names  = ["Tom", "Harry", "John"]
@emails = ["[email protected]", "[email protected]", "[email protected]"]

@list = @names.zip( @emails )
#=> [["Tom", "[email protected]"], ["Harry", "[email protected]"], ["John", "[email protected]"]]

@list.each do |name,email|
  # When a block is passed an array you can automatically "destructure"
  # the array parts into named variables. Yay for Ruby!
  p "#{name} <#{email}>"
end
#=> "Tom <[email protected]>"
#=> "Harry <[email protected]>"
#=> "John <[email protected]>"

@urls = ["yahoo.com", "ebay.com", "google.com"]

# Zipping multiple arrays together
@names.zip( @emails, @urls ).each do |name,email,url|
  p "#{name} <#{email}> :: #{url}"
end
#=> "Tom <[email protected]> :: yahoo.com"
#=> "Harry <[email protected]> :: ebay.com"
#=> "John <[email protected]> :: google.com"

Ответ 2

Просто чтобы быть другим:

[@names, @emails, @urls].transpose.each do |name, email, url|
  # . . .
end

Это похоже на то, что Array # zip, за исключением того, что в этом случае не будет никакого заполнения пробелов в коротких строках; если что-то не хватает, будет вызвано исключение.

Ответ 3

Hash[*names.zip(emails).flatten]

Это даст вам хэш с именем = > email.

Ответ 4

Вы можете использовать zip, чтобы объединить два массива, а затем map, чтобы создать объекты Item из пар имя-email. Предполагая, что у вас есть класс Item, методы initialize которого принимают хэш, код будет выглядеть так:

@list = @names.zip(@emails).map do |name, email|
  Item.new(:name => name, :email => email)
end

Ответ 5

Попробуйте это

Hash[@names.zip(@emails)]

У вас есть два массива @names = [ "Том", "Гарри", "Джон" ]

@emails = [ "[email protected]", "[email protected]", "[email protected]" ]

@names.zip(@emails) он объединяет @emails с @names, связанными с их индексом, как показано ниже  [[ "Tom", "[email protected]" ], [ "Гарри", "[email protected]" ], [ "Джон", "[email protected]" ]]

Теперь мы можем преобразовать этот массив в хэш используя Hash [@names.zip(@emails)]