#ruby-on-rails #ruby #arrays #hash
#ruby-on-rails #ruby #массивы #хэш
Вопрос:
Новичок в rails и испытывает некоторые трудности!! Справка
Итак, у меня есть 2 массива (один для сведений о работе сотрудника, а другой для личных данных сотрудника), оба из которых содержат уникальный соответствующий ключ (код сотрудника), который связывает информацию вместе.
Как можно сохранить оба этих массива в хэше по коду сотрудника, поэтому рабочие данные и личные данные должны быть связаны вместе с уникальным ключом.
Я перепробовал всевозможные методы сортировки, но, похоже, ничего не помогает.
В принципе, в конце я хочу иметь возможность распечатать список всех сотрудников, отображая все их данные вместе.
СОТРУДНИК: Имя: Джон Ключ: 001 и т.д. и т.п. ПОДРОБНОСТИ: Должность: Менеджер Ключ 001 и т.д. и т.п.
СОТРУДНИК: Имя: Салли Ключ: 002 и т.д. и т.п. ПОДРОБНОСТИ: Должность: Ключ администратора 002 и т.д. и т.п.
и так далее..
Комментарии:
1. Являются ли два объекта, которые у вас есть, массивами или хэшами? Как вы можете идентифицировать уникальный ключ в массиве? Это больше похоже на то, что это хэши. Пожалуйста, не могли бы вы опубликовать несколько примеров структур данных, с которыми мы могли бы работать?
Ответ №1:
предполагая, что «employees» — это массив объектов Employee, а «details» — массив объектов Detail…
employees.map do |employee|
{
:employee => employee, :details => details.select { |detail| detail.key == employee.key }
}
end
Кстати, есть ли какая-то причина, по которой у вас нет ассоциаций между сотрудником и деталями? (вы отметили это как Rails …)
Ответ №2:
Employee = Struct.new(:id, :name)
Detail = Struct.new(:id, :title)
employees = [ Employee.new(1, "John"), Employee.new(2, "Sally") ]
details = [ Detail.new(2, "Admin"), Detail.new(1, "Manager") ]
Hash[
employees.map do |employee|
detail = details.find { |d| d.id == employee.id }
[ employee.id, { :employee => employee, :detail => detail } ]
end
]
Или, если вы знаете, что все идентификаторы будут существовать в обоих массивах:
Hash[
employees.sort_by { |e| e.id }.zip(details.sort_by { |d| d.id }).map do |e,d|
[ e.id, { :employee => e, :detail => d } ]
end
]
Дает:
{
1 => {
:employee => #<struct Employee id=1, name="John">,
:details => #<struct Detail id=1, title="Manager">
},
2 => {
:employee => #<struct Employee id=2, name="Sally">,
:details => #<struct Detail id=2, title="Admin">
}
}