我有一系列哈希
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"}]
我尝试了一个很长的复杂方法,它只是循环遍历它以组合哈希,但我无法使其工作。必须有一种更好,更简单的方法。
答案 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