Ruby基于key=>;从数组中删除重复项;价值

Ruby基于key=>;从数组中删除重复项;价值,ruby,array-unique,Ruby,Array Unique,我有一个音乐曲目阵列,在这个阵列中,同一首歌可以显示多次,因为它在多张专辑中发布。我正试图从数组中删除它们,以便在列表中只显示真正的unique 散列如下所示: "tracks" => [ [0] { "id" => 1, "Title" => "Intergalactic", "ArtistName" => "Beastie Boys" }, [1] { "id" => 2,

我有一个音乐曲目阵列,在这个阵列中,同一首歌可以显示多次,因为它在多张专辑中发布。我正试图从数组中删除它们,以便在列表中只显示真正的unique

散列如下所示:

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

我需要一种基于
标题
键删除重复项的方法。是否要这样做?

如果您使用的是ActiveSupport,您可以通过以下方式使用uniq\u:

tracks.uniq_by {|track| track["title"]}
如果没有,那么您可以自己轻松地实现它

#文件activesupport/lib/active_support/core_ext/array/uniq_by.rb,第6行
def uniq_by
散列,数组={},[]
每个{i | hash[yield(i)]| |=(数组1.9中的方法都会占用一个块,因此如果您的hash是
h
,则:

h['tracks'].uniq! { |x| x['Title'] }
如果你在1.8中,那么你可以用以下方法来伪装它:

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

我假设您希望在适当的位置修改它。

虽然其他方法都是正确的,但我会添加一些我在其他地方找到的额外的糖

使用此扩展符号:

class Symbol
  def with(*args, &block)
    ->(caller, *rest) { caller.send(self, *rest, *args, &block) }
  end
end
而不是像这样编写简单的迭代块

foo_数组。现在,您可以使用

foo\u array.each&:update\u bar.with(“baz”)

类似于您编写
的方式,可能没有。请尝试(:[],“key”)

foo_数组.uniq{foo | foo[“key”]}
现在与

foo_数组.uniq(&:[]带(“键”))


我希望这会有所帮助

非常感谢您的帮助!!!!每天我都在做Ruby开发,我开始变得更快乐/更好!我不知道这是在1.9中,谢谢您的提示。显然,如果您使用1.9,这是正确的答案。@DuoSRX:它似乎不那么广为人知,也没有很好的文档记录(你必须从例子中推断出来。)正确的答案是完成任务的答案:)如果你需要条目具有多个值的唯一性怎么办?我有同样的情况,但需要检查标题、艺术家和作曲家是否相同。对于
uniq
块,我只能使用一个值!@kakubei:What
%w[ab]=%w[ab]
?我想这就是解决您问题的方法。
class Symbol
  def with(*args, &block)
    ->(caller, *rest) { caller.send(self, *rest, *args, &block) }
  end
end