Не очень симпатично с несколькими скобками в блоке, но это делает только одну итерацию api_response.
я есть массив хэшей, представляющих объекты в ответ на вызов 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?