У меня есть массив хешей, представляющих объекты в качестве ответа на вызов API. Мне нужно извлечь данные из некоторых хешей, а один конкретный ключ служит идентификатором хэш-объекта. Я хотел бы преобразовать массив в хэш с ключами как идентификаторы, а значения - как исходный хэш с этим идентификатором.
Вот что я говорю:
api_response = [
{ :id => 1, :foo => 'bar' },
{ :id => 2, :foo => 'another bar' },
# ..
]
ideal_response = {
1 => { :id => 1, :foo => 'bar' },
2 => { :id => 2, :foo => 'another bar' },
# ..
}
Есть два способа, которыми я мог бы это сделать.
- Сопоставьте данные с
ideal_response
(ниже) - Используйте
api_response.find { |x| x[:id] == i }
для каждой записи, к которой мне нужно обратиться. - Метод, о котором я не знаю, возможно, используя способ использования
map
для создания хэша, изначально.
Мой метод отображения:
keys = data.map { |x| x[:id] }
mapped = Hash[*keys.zip(data).flatten]
Я не могу не чувствовать, что есть более совершенный, более аккуратный способ сделать это. Вариант 2 очень эффективен, когда существует очень минимальное количество записей, к которым необходимо получить доступ. Отображение здесь отличается, но оно начинает разрушаться, когда в ответе много записей. К счастью, я не ожидаю, что там будет более 50-100 записей, поэтому сопоставления достаточно.
Есть ли более разумный, более аккуратный или более эффективный способ сделать это в Ruby?