Convierta una matriz de hashes en un hash de hashes, indexados por un atributo de los hashes
Tengo una matriz de hashes que representan objetos como respuesta a una llamada API. Necesito extraer datos de algunos de los hash, y una clave en particular sirve como id para el objeto hash. Me gustaría convertir la matriz en un hash con las claves como los identificadores y los valores como el hash original con esa identificación.
Esto es de lo que estoy hablando:
api_response = [
{ :id => 1, :foo => 'bar' },
{ :id => 2, :foo => 'another bar' },
# ..
]
ideal_response = {
1 => { :id => 1, :foo => 'bar' },
2 => { :id => 2, :foo => 'another bar' },
# ..
}
Hay dos maneras en que podría pensar en hacer esto.
Asigne los datos a laideal_response
(abajo)Utilizarapi_response.find { |x| x[:id] == i }
para cada registro que necesito acceder.Un método que desconozco, que posiblemente implique una forma de usarmap
para construir un hash, de forma nativa.Mi método de mapeo:
keys = data.map { |x| x[:id] }
mapped = Hash[*keys.zip(data).flatten]
No puedo evitar sentir que hay una forma más eficiente y ordenada de hacer esto. La opción 2 es muy eficaz cuando hay un número mínimo de registros a los que se debe acceder. La asignación sobresale aquí, pero comienza a descomponerse cuando hay muchos registros en la respuesta. Afortunadamente, no espero que haya más de 50-100 registros, por lo que el mapeo es suficiente.
¿Hay una manera más inteligente, ordenada o más eficiente de hacer esto en Ruby?