我有一个音乐曲目阵列,在这个阵列中,由于在多张专辑中发布,同一首歌曲可以多次出现。我正在尝试将它们从数组中删除,以便列表中只显示真正的唯一性。
Hash看起来像这样:
"tracks" => [
[0] {
"id" => 1,
"Title" => "Intergalactic",
"ArtistName" => "Beastie Boys"
},
[1] {
"id" => 2,
"Title" => "Intergalactic",
"ArtistName" => "Beastie Boys"
}
]
我需要一种方法来删除基于Title
密钥的重复项。不管怎么说,做这件事吗?
发布于 2011-10-07 02:08:12
如果您使用的是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
发布于 2011-10-07 02:45:29
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)
我假设您想要就地修改它。
发布于 2019-07-02 02:03:21
虽然其他方法都是正确的,但我会加入一些我在其他地方找到的额外的糖。
使用此Symbol扩展:
class Symbol
def with(*args, &block)
->(caller, *rest) { caller.send(self, *rest, *args, &block) }
end
end
而不是像这样编写简单的迭代代码块
foo_array.each{ |foo| foo.update_bar("baz") }
,您现在可以使用
foo_array.each &:update_bar.with("baz")
类似于您编写maybe_nil.try(:[], "key")
的方式...
foo_array.uniq{ |foo| foo["key"] }
现在与
foo_array.uniq(&:[].with("key"))
我希望这能帮到你
https://stackoverflow.com/questions/7678509
复制相似问题