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