2011-10-06 6 views
6

Tengo una matriz de pistas musicales y en esta matriz la misma canción puede aparecer varias veces debido a que se lanzó en varios álbumes. Estoy tratando de eliminarlos de la matriz para que solo únicos verdaderos aparezcan en la lista.Ruby eliminar duplicados de la matriz en función de la clave => valor

El hash es como la siguiente:

"tracks" => [ 
    [0] { 
     "id" => 1, 
     "Title" => "Intergalactic", 
     "ArtistName" => "Beastie Boys" 
    }, 
    [1] { 
     "id" => 2, 
     "Title" => "Intergalactic", 
     "ArtistName" => "Beastie Boys" 
    } 
] 

Estoy necesitando una manera de eliminar los duplicados en base a la clave Title. De todos modos de hacer esto?

Respuesta

11

Si está utilizando ActiveSupport, puede utilizar uniq_by, así:

tracks.uniq_by {|track| track["title"]} 

Si no es así, entonces se puede implementar fácilmente por sí mismo. See this.

# File activesupport/lib/active_support/core_ext/array/uniq_by.rb, line 6 
    def uniq_by 
    hash, array = {}, [] 
    each { |i| hash[yield(i)] ||= (array << i) } 
    array 
    end 
+0

¡Muchas gracias por la ayuda! Cada día que estoy haciendo el desarrollo de Ruby, empiezo a ser una persona más feliz/mejor – dennismonsewicz

8

El método Array#uniq! en 1.9 tiene un bloque de modo que si su Hash es h a continuación:

h['tracks'].uniq! { |x| x['Title'] } 

Si estás en 1.8 entonces usted puede fingir con:

h['tracks'] = h['tracks'].group_by { |x| x['Title'] }.values.map(&:first) 

Supongo que quiere modificarlo en el lugar.

+0

¡Ah! No sabía que estaba en 1.9, gracias por el consejo. Obviamente, si usa 1.9, esta es la respuesta correcta. – DuoSRX

+0

@DuoSRX: No parece ser tan conocido y no está exactamente bien documentado (hay que inferirlo de los ejemplos). Una respuesta correcta es aquella que hace el trabajo :) –

+0

¿Qué sucede si necesita que la entrada sea única por más de un valor? Tengo la misma situación, pero necesito verificar que el Título, el Artista y el Compositor sean los mismos. ¡Con el bloque 'uniq' solo puedo usar un valor! – kakubei

Cuestiones relacionadas