Tengo una matriz de valores hash, y quiero los valores únicos de ella. Llamar al Array.uniq
no me da lo que espero.¿Cómo obtengo los elementos únicos de una matriz de hashes en Ruby?
a = [{:a => 1},{:a => 2}, {:a => 1}]
a.uniq # => [{:a => 1}, {:a => 2}, {:a => 1}]
donde esperaba:
[{:a => 1}, {:a => 2}]
En la búsqueda alrededor en la red, no he venido para arriba con una solución que yo estaba contento con. La gente recomendaba redefinir Hash.eql?
y Hash.hash
, ya que eso es lo que Array.uniq
está consultando.
Edit: Donde me topé con esto en el mundo real, los hashes fueron un poco más complejos. Eran el resultado de JSON analizado que tenía múltiples campos, algunos de los cuales también eran valores hash. Tenía una variedad de esos resultados que quería filtrar los valores únicos.
no me gusta el redefinen Hash.eql?
y la solución Hash.hash
, porque yo bien tienen que redefinir Hash
a nivel mundial, o redefinirlo para cada entrada en mi matriz. Cambiar la definición de Hash
para cada entrada sería engorroso, especialmente porque puede haber hashes anidados dentro de cada entrada.
Cambiando Hash
globalmente tiene algún potencial, especialmente si se hizo temporalmente. Me gustaría crear otra clase o función de ayuda que cubra el ahorro de las definiciones antiguas y restaurarlas, pero creo que esto agrega más complejidad de la que realmente se necesita.
El uso de inject
parece una buena alternativa a la redefinición de Hash
.
mucho más mejor, creo que el enlace que he publicado anteriormente – edthix