【问题标题】:Unique objects in grouped hash分组哈希中的唯一对象
【发布时间】:2015-01-09 08:44:11
【问题描述】:

我有一个由.group_by 方法创建的散列,其中字符串作为键,AR 对象作为值。我想摆脱 AR 对象重复字段(其他字段可能相同也可能不同)

为了澄清我创建了这个 sn-p 的问题:

require 'ostruct'   

def os_new(fid); OpenStruct.new(fid: fid, rand: rand(100)); end                                                                                                                                              
a = [os_new(1), os_new(2), os_new(3)]                                                                                                                                                
b = [os_new(3), os_new(3), os_new(2)]                                                                                                                                                
c = [os_new(5), os_new(5), os_new(5), os_new(5)] 

grouped_hash = { a: a, b: b, c: c} 

grouped_hash 这里是:

# {:a=>[#<OpenStruct fid=1, rand=7>, #<OpenStruct fid=2, rand=50>, #<OpenStruct fid=3, rand=13>], 
#  :b=>[#<OpenStruct fid=3, rand=51>, #<OpenStruct fid=3, rand=58>, #<OpenStruct fid=2, rand=88>], 
#  :c=>[#<OpenStruct fid=5, rand=40>, #<OpenStruct fid=5, rand=8>, #<OpenStruct fid=5, rand=45>, #<OpenStruct fid=5, rand=72>]} 

现在,我想要一个哈希,每个键都有唯一的 fids:

# {:a=>[#<OpenStruct fid=1, rand=7>, #<OpenStruct fid=2, rand=50>, #<OpenStruct fid=3, rand=13>], 
#  :b=>[#<OpenStruct fid=3, rand=51>, #<OpenStruct fid=2, rand=88>], 
#  :c=>[#<OpenStruct fid=5, rand=40>]} 

我的解决方案需要几个操作,而且看起来很丑。

grouped_hash.each_value do |value|                                                                                                                                                     
  fids = []
  value.delete_if do |object|
    if fids.include? object.fid                                                                                                                                                            
      true
    else                                                                                                                                                                                   
      fids << object.fid
      false
    end                                                                                                                                                                                
  end
end

我正在寻找最优雅(可能是 1-liner)和最有效的方式(无需重新创建哈希)。

【问题讨论】:

    标签: ruby-on-rails ruby hash openstruct


    【解决方案1】:

    grouped_hash.each_value(&amp;:uniq)

    根据 AR 对象,Rails 故意将相等检查委托给标识列。如果您想知道两个 AR 对象包含相同的值,请比较在两者上调用 #attributes 的结果。

    【讨论】:

      【解决方案2】:

      不完全是一行(虽然你也可以写成一行):

      grouped_hash.inject({}) do |hash, element|
        hash[element.first] = element.last.uniq(&:fid)
        hash
      end
      

      【讨论】:

      • 我更新了一个问题,以免被id 弄糊涂,并证明每个对象中还有其他字段,所以uniq 不起作用
      • 谢谢!我明白了!你的解决方案重新创建了一个哈希,所以我将它与@Tensho 答案结合起来,得到了我想要的
      【解决方案3】:

      通过结合 Tenshokatafrakt(谢谢你们)的答案,我做了这个:

      grouped_hash.each_value { |v| v.uniq!(&:fid) }
      

      【讨论】:

        猜你喜欢
        • 2011-02-15
        • 1970-01-01
        • 2019-11-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-09-28
        相关资源
        最近更新 更多