【问题标题】:Merge like array values to new grouped array?将类似数组值合并到新的分组数组?
【发布时间】:2014-10-14 12:37:57
【问题描述】:

我需要按如下方式组合类似的数组值:

发件人:

arr = ['abc', 'abc', 'eff', 'eff', 'foo', 'bar', 'bar', 'bar']

收件人:

merged_like_arr = [ ['abc', 'abc'], ['eff', 'eff'], ['foo'], ['bar', 'bar', 'bar']]

基本上有一个 ActiveRecord 对象,它按顺序返回记录集合。

aff=Registration.order('affiliate DESC')
aff.map{|code| code. affiliate }
  # produces the following:
  # arr = ['abc', 'abc', 'eff', 'eff', 'foo', 'bar', 'bar', 'bar']

我需要将arr 的数据形式更改为merged_like_arr(如上所示),以便我可以这样做:

merged_like_arr.sort_by{|arr|-arr.size}.first(10)
 #=> [ ["bar", "bar", "bar"], ["eff", "eff"], ["abc", "abc"] ... ] 

目的是通过查找他们的会员ID在注册表中使用的次数来找到系统中排名前10位的会员。

也欢迎替代实现。谢谢!

【问题讨论】:

    标签: ruby-on-rails ruby arrays postgresql activerecord


    【解决方案1】:

    目的是通过查找他们的会员ID在注册表中使用的次数来找到系统中排名前10位的会员。

    您可以使用countgroup 进行此类查询:

    如果countgroup一起使用,它返回一个Hash,其键代表聚合列,值是各自的数量:

    Person.group(:city).count
    # => { 'Rome' => 5, 'Paris' => 3 }
    

    在你的情况下:

    Registration.group(:affiliate).count
    #=> { 'abc' => 2, 'eff' => 2, 'foo' => 1, 'bar' => 3 }
    

    【讨论】:

      【解决方案2】:

      这应该可行:

      arr = ['abc', 'abc', 'eff', 'eff', 'foo', 'bar', 'bar', 'bar']
      
      arr = arr.group_by { |e| e }.values
      # => [["abc", "abc"], ["eff", "eff"], ["foo"], ["bar", "bar", "bar"]] 
      

      【讨论】:

      • 我发誓我的大脑放屁是深夜最臭的。我可以发誓在发布这个问题之前我已经尝试了 12 次确切的方法。谢谢朋友!最后一行代码:affs.group_by { |e| e }.values.sort_by{|j|-j.size}.first(10) Awesome... 暂时留下问题以查看是否提供了“替代实现”。如果没有,我会接受你的回答...
      猜你喜欢
      • 2017-07-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-02-25
      • 1970-01-01
      • 2022-01-14
      • 2021-01-24
      相关资源
      最近更新 更多