2011-10-06 51 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

@DooSRX:它看起來並不是那麼廣爲人知,並且沒有完全記錄(你必須從例子中推斷出它)。正確的答案是完成工作的人:) –

+0

如果您需要該條目由多個值唯一,該怎麼辦?我有同樣的情況,但需要檢查標題,藝術家和作曲家是否相同。使用'uniq'塊,我只能使用一個值! – kakubei