Ruby基于key => value从数组中删除重复项

den*_*icz 7 ruby array-unique

我有一系列音乐曲目,在这个阵列中,由于在多张专辑中发行,同一首歌可以多次显示.我试图从数组中删除它们,以便只在列表中显示真正的唯一.

哈希看起来像这样:

"tracks" => [
    [0] {
        "id" => 1,
        "Title" => "Intergalactic",
        "ArtistName" => "Beastie Boys"
    },
    [1] {
        "id" => 2,
        "Title" => "Intergalactic",
        "ArtistName" => "Beastie Boys"
    }
]
Run Code Online (Sandbox Code Playgroud)

我需要一种方法来删除基于Title密钥的重复项.无论如何这样做?

Duo*_*SRX 11

如果您使用的是ActiveSupport,则可以使用uniq_by,如下所示:

tracks.uniq_by {|track| track["title"]}
Run Code Online (Sandbox Code Playgroud)

如果没有,那么您可以自己轻松实现它.看到这个.

# 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
Run Code Online (Sandbox Code Playgroud)


mu *_*ort 9

Array#uniq!1.9中的方法需要一个块,所以如果你的Hash是h:

h['tracks'].uniq! { |x| x['Title'] }
Run Code Online (Sandbox Code Playgroud)

如果你在1.8,那么你可以伪造它:

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

我假设你想要就地修改它.