2011-10-06 17 views
6

Posiadam szereg ścieżek muzycznych. W tej tablicy ta sama piosenka może pojawiać się wiele razy z powodu wydania na wielu albumach. Próbuję usunąć je z tablicy, aby na liście pojawiały się tylko prawdziwe unikaty.Usuwanie duplikatów z tablicy na podstawie klucza => wartość

Hash wygląda mniej więcej tak:

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

jestem potrzebujący sposób, aby usunąć duplikaty oparte na kluczu Title. W każdym razie robienia tego?

Odpowiedz

11

Jeśli używasz ActiveSupport, można użyć uniq_by, tak:

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

Jeśli nie, to można łatwo wdrożyć go samodzielnie. 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

Dziękuję bardzo za pomoc !!!! Każdego dnia, w którym robię rozwój Ruby, zaczynam stać się szczęśliwszą/lepszą osobą – dennismonsewicz

8

Sposób 1,9 Array#uniq! zajmuje blok więc jeśli Hash jest h następnie:

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

Jeśli jesteś w 1,8 to możesz udawać się:

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

Zakładam, że chcesz go zmodyfikować w miejscu.

+0

Ah! Nie wiedziałem, że to 1.9, dzięki za napiwek. Oczywiście, jeśli używasz 1.9, to jest właściwa odpowiedź. – DuoSRX

+0

@DuoSRX: Nie wydaje się być tak dobrze znany i nie jest dokładnie udokumentowany (musisz wywnioskować z przykładów). Odpowiednią odpowiedzią jest ta, która wykonuje pracę :) –

+0

Co, jeśli potrzebujesz, aby wpis był niepowtarzalny przez więcej niż jedną wartość? Mam tę samą sytuację, ale muszę sprawdzić, czy tytuł, artysta i kompozytor są takie same. Z blokiem 'uniq' mogę użyć tylko jednej wartości! – kakubei

Powiązane problemy