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 particular sirve como id para el objeto hash. Me gustaría convertir la matriz en un hash con las claves como identificadores, y los valores como el hash original con esa identificación.Convertir matriz de hashes en hash-of-hashes, indexado por un atributo de los hash
Aquí es 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 que podría pensar en hacer esto.
- en el mapa los datos a la
ideal_response
(continuación) - Uso
api_response.find { |x| x[:id] == i }
para cada registro que necesito para acceder. - Un método que desconozco, posiblemente involucrando una forma de usar
map
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 un camino con más prestaciones, más ordenado de hacer esto. La opción 2 es muy efectiva cuando hay una cantidad mínima de registros a los que se debe acceder. El mapeo se destaca 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 alguna manera más inteligente, ordenada o más eficiente de hacer esto en Ruby?
Esto es mejor que el mapeo que tuve en términos de rendimiento y orden, pero acceder a los registros a través de 'data [id] [0]' o 'data [id] .first' es un poco engorroso. Sin embargo, me estoy poniendo nervioso en este punto. Veamos si a alguien más le importa arrojar su sombrero al ring. – coreyward
Eso es el resultado de la posibilidad de encontrar una clave duplicada. 'group_by' es una rutina genérica diseñada para seguridad con datos desconocidos. Tener conocimientos específicos de las aplicaciones, como saber que nunca, nunca, encontrará un duplicado y la consiguiente colisión de claves y pérdida de datos, permitiría simplificar la estructura de datos en un nivel. –