首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >基于key=>value的数组去重

基于key=>value的数组去重
EN

Stack Overflow用户
提问于 2011-10-07 02:00:52
回答 3查看 4.7K关注 0票数 7

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

Hash看起来像这样:

代码语言:javascript
运行
复制
"tracks" => [
    [0] {
        "id" => 1,
        "Title" => "Intergalactic",
        "ArtistName" => "Beastie Boys"
    },
    [1] {
        "id" => 2,
        "Title" => "Intergalactic",
        "ArtistName" => "Beastie Boys"
    }
]

我需要一种方法来删除基于Title密钥的重复项。不管怎么说,做这件事吗?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-10-07 02:08:12

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

代码语言:javascript
运行
复制
tracks.uniq_by {|track| track["title"]}

如果没有,那么您可以很容易地自己实现它。See this.

代码语言:javascript
运行
复制
# 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
票数 11
EN

Stack Overflow用户

发布于 2011-10-07 02:45:29

1.9中的Array#uniq!方法需要一个块,所以如果你的哈希值为h,那么:

代码语言:javascript
运行
复制
h['tracks'].uniq! { |x| x['Title'] }

如果你在1.8版本中,你可以用以下命令来伪造它:

代码语言:javascript
运行
复制
h['tracks'] = h['tracks'].group_by { |x| x['Title'] }.values.map(&:first)

我假设您想要就地修改它。

票数 10
EN

Stack Overflow用户

发布于 2019-07-02 02:03:21

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

使用此Symbol扩展:

代码语言:javascript
运行
复制
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"))

我希望这能帮到你

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7678509

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档