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 %>
У меня возникли проблемы с пониманием того, как я могу достичь этой цели. Любые мысли?
Ответы
Ответ 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)]