Группировка данных из 2 массивов по уникальному ключу

#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">
  }
}