2011-10-06 25 views
6

私はミュージカルトラックの配列を持っています。この配列では、複数のアルバムにリリースされているため同じ曲が複数回表示されることがあります。私は配列からそれらを削除しようとしているので、真のユニークだけがリストに表示されます。キー=>値に基づいて配列から重複を削除するRuby

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

私はTitleキーに基づいて重複を削除する方法を必要としています:

ハッシュは次のようになります。とにかくこれをやって?

答えて

11

あなたがactivesupportのを使用している場合は、そのように、uniq_by使用することができます。

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

をされていない場合、あなたは簡単にそれを自分で実装することができます。 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

本当にありがとうございました!毎日私はRubyの開発をしています。私はより幸せな人になり始めます。 – dennismonsewicz

8

1.9でArray#uniq!方法は、あなたのハッシュが、その後hであるかのように、ブロックを取る:それはで

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

あなたが1.8にいるなら、あなたは偽できます:

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

私はそれをインプレースで変更したいと思っています。

+0

ああ!私はそれが1.9であったことを知らなかった、チップのおかげで。明らかに1.9を使用している場合、これは正しい答えです。 – DuoSRX

+0

@DuoSRX:よく知られているようではなく、正確に文書化されていません(例から推論する必要があります)。正しい答えは、仕事を終わらせるものです:) –

+0

複数の値によってエントリが一意である必要がある場合はどうなりますか?私は同じ状況ですが、タイトル、アーティスト、作曲家が同じであることを確認する必要があります。 'uniq'ブロックでは、私は1つの値しか使用できません! – kakubei

関連する問題