根据Ruby中的哈希键对数组进行Couting



我有一个数组

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_byuser键,然后计算每组中的元素数量:

改进的解决方案

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] = 0h有时被称为计数散列

相关内容

  • 没有找到相关文章

最新更新