Преобразование массива хэшей в хеш-значение, индексируемое атрибутом хэшей

У меня есть массив хэшей, представляющих объекты, в ответ на вызов 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' },
  # ..
}

Я могу придумать два способа выполняя это.

  1. Сопоставьте данные с ideal_response (ниже)
  2. Используйте api_response.find {| x | x [: id] == i} для каждой записи, к которой мне нужно получить доступ.
  3. Метод, о котором я не знаю, возможно, включающий способ использования map для создания хэша изначально .

Мой метод отображения:

keys = data.map { |x| x[:id] }
mapped = Hash[*keys.zip(data).flatten]

Я не могу не чувствовать, что есть более производительный и аккуратный способ сделать это. Вариант 2 очень эффективен при минимальном количестве записей, к которым необходимо получить доступ. Сопоставление здесь превосходно, но оно начинает ломаться, когда в ответе много записей. К счастью, я не Не ожидаю, что будет более 50-100 записей, поэтому сопоставления достаточно.

Есть ли более умный, аккуратный или более производительный способ сделать это в Ruby?

16
задан coreyward 20 January 2011 в 23:38
поделиться