合并哈希数组加法

时间:2015-07-24 11:25:25

标签: ruby

我有一系列哈希

hash = [{"user"=>"10910", "count"=>"2"},
{"user"=>"10910", "count"=>"8"}, 
{"user"=>"10910", "count"=>"4"}, 
{"user"=>"11245", "count"=>"3"}, 
{"user"=>"10910", "count"=>"2"}, 
{"user"=>"10910", "count"=>"7"}, 
{"user"=>"11245", "count"=>"2"}, 
{"user"=>"10910", "count"=>"1"}, 
{"user"=>"13869", "count"=>"2"}]

我正在尝试找到一种方法将其合并到一个新的哈希数组中,其中每个用户只出现一次,其计数是之前与该用户关联的所有计数的总和。

以上应该会产生以下哈希:

newhash = [{"user"=>"10910", "count"=>"24"},
{"user"=>"11245", "count"=>"5"}, 
{"user"=>"13869", "count"=>"2"}]

我尝试了一个很长的复杂方法,它只是循环遍历它以组合哈希,但我无法使其工作。必须有一种更好,更简单的方法。

3 个答案:

答案 0 :(得分:6)

hash
.to_enum.with_object(Hash.new(0)){|e, h| h[e["user"]] += e["count"].to_i}
.map{|k, v| {"user" => k, "count" => v.to_s}}

答案 1 :(得分:2)

我会做这样的事情。

grouped = hash.group_by{|h| h['user']}
grouped.map do |user_id, user| 
  total = user.reduce(0) { |sum, h| sum+=h['count'].to_i }
  {'user'=> user_id, 'count'=> total.to_s}
end

答案 2 :(得分:0)

我写的是:

hash = [{"user"=>"10910", "count"=>2},
{"user"=>"10910", "count"=>8}, 
{"user"=>"10910", "count"=>4}, 
{"user"=>"11245", "count"=>3}, 
{"user"=>"10910", "count"=>2}, 
{"user"=>"10910", "count"=>7}, 
{"user"=>"11245", "count"=>2}, 
{"user"=>"10910", "count"=>1}, 
{"user"=>"13869", "count"=>2}]

merged = Hash.new { |h, k| h[k] = {"user" => k, "count" => 0} }
hash.each { |x| merged[x["user"]]["count"] += x["count"] }

newhash = merged.values