【问题标题】:Ruby removing duplicates from array based on key=>valueRuby 根据 key=>value 从数组中删除重复项
【发布时间】:2023-04-05 10:20:02
【问题描述】:

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

哈希看起来像这样:

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

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

【问题讨论】:

    标签: ruby array-unique


    【解决方案1】:

    如果您使用 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
    

    【讨论】:

    • 非常感谢您的帮助!!!!我每天都在做 Ruby 开发,我开始成为一个更快乐/更好的人
    【解决方案2】:

    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)
    

    我假设您想就地修改它。

    【讨论】:

    • 啊!我不知道它是在 1.9 中,谢谢你的提示。显然,如果您使用的是 1.9,这是正确的答案。
    • @DuoSRX:它似乎并不为人所知,也没有完全记录在案(您必须从示例中推断出来)。一个正确的答案是完成工作:)
    • 如果您需要条目在多个值上是唯一的怎么办?我有同样的情况,但需要检查标题、艺术家和作曲家是否相同。对于uniq 块,我只能使用一个值!
    • @kakubei:%w[a b] == %w[a b] 是什么?我怀疑这是您问题的解决方案。
    【解决方案3】:

    虽然其他方法是正确的,但我会在 SO 的其他地方发现一些额外的糖。

    使用 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 &amp;:update_bar.with("baz")

    类似于你写maybe_nil.try(:[], "key")...

    foo_array.uniq{ |foo| foo["key"] } 现在等同于

    foo_array.uniq(&amp;:[].with("key"))

    希望对你有帮助

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-11-06
      • 2012-03-24
      • 2014-05-26
      • 1970-01-01
      • 2012-08-31
      • 2012-05-17
      • 1970-01-01
      • 2016-05-16
      相关资源
      最近更新 更多