我有一个数组
data = [{:user=>1399, :job=>10270}, {:user=>2614, :job=>10270},
{:user=>3112, :job=>10270}, {:user=>2614, :job=>10271},
{:user=>1455, :job=>10271}]
其中1399、2614、3112、1455是用户id,10270、10271是作业id。
我想显示每个用户的作业数,而不考虑作业id。
预期结果:
1399 => 1
2614 => 2 # because 2614 has 2 two jobs
3112 => 1
1455 => 1
我需要这个在阵列中
您可以通过map
提取用户ID,然后让Ruby通过tally
:计算出现次数
data.map { |h| h[:user] } #=> [1399, 2614, 3112, 2614, 1455]
.tally #=> {1399=>1, 2614=>2, 3112=>1, 1455=>1}
首先group_by
user
键,然后计算每组中的元素数量:
改进的解决方案
data = [{:user=>1399, :job=>10270}, {:user=>2614, :job=>10270}, {:user=>3112, :job=>10270}, {:user=>2614, :job=>10271}, {:user=>1455, :job=>10271}]
data.group_by {|e| e[:user]}
.transform_values(&:size)
# => {1399=>1, 2614=>2, 3112=>1, 1455=>1}
原始解决方案
data = [{:user=>1399, :job=>10270}, {:user=>2614, :job=>10270}, {:user=>3112, :job=>10270}, {:user=>2614, :job=>10271}, {:user=>1455, :job=>10271}]
data.group_by {|e| e[:user]}
.map{|id, a| [id, a.size]}
.to_h
# => {1399=>1, 2614=>2, 3112=>1, 1455=>1}
我的答案是完善我认为的标准方法。
data.each_with_object(Hash.new(0)) { |g,h| h[g[:user]] += 1 }
#=> {1399=>1, 2614=>2, 3112=>1, 1455=>1}
它适用于较旧版本的Ruby,并避免构建临时数组或哈希。
请参阅Hash::new的形式,它接受一个参数而不接受块。如果散列被定义为h = Hash.new(0)
,那么稍后,如果(并且仅当)h
没有密钥k
,则在h[k] += 0
之前执行h[k] = 0
。h
有时被称为计数散列。