计算数组中重复元素的数量

问题描述 投票:0回答:4

控制器:

@user_location = Country.joins(:user).order(:name).compact.uniq

查看(haml):

- @user_location.each do |user|
  %li= user.name

此时,数组的所有重复元素都将被删除(uniq)。

如何显示数组中重复元素的数量?例如:如果我的数组有

一二二三四

然后我需要表明

一二(2)三四

ruby-on-rails ruby
4个回答
3
投票

我希望像这样的东西可能会起作用:

# in the controller (this returns a hash)
@locations = Country.joins(:user).order(:name).group(:name).count

# in your view
- @locations.each do |name, count|
  %li
    = name
    = "(#{count})" if count > 1

2
投票

你需要group_by + map。像这样:

array.group_by(&:itself).map do |k, v|
 { value: k, count: v.length }
end

你会有像这样的哈希数组:{value: 'Two', count: 2}

您可以以任何所需的方式返回数据。但是,直接从SQL获取分组记录要好得多。


1
投票

您可以使用each_with_object进行迭代,在将元素分配给散列键时对其进行计数。例如:

array = %w(One Two Two Three Four)

counts = array.each_with_object(Hash.new(0)) do |el, hash| 
  hash[el] += 1
end
# => {"One"=>1, "Two"=>2, "Three"=>1, "Four"=>1}

counts.map { |k, v| v > 1 ? "#{k} (#{v})" : k }
# => ["One", "Two (2)", "Three", "Four"]

这看起来像你在追求什么?如果没有,或者您有任何疑问,请告诉我!


0
投票
%w[One Two Two Three Four].
  group_by{|x|x}.
  map{|k, v|[k,v.count>1?" (#{v.count})":nil]}.
  map(&:compact).
  map(&:join)
#⇒ ["One", "Two (2)", "Three", "Four"]
© www.soinside.com 2019 - 2024. All rights reserved.