Ruby 用加法合并散列数组
我有一个哈希数组Ruby 用加法合并散列数组,ruby,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"=>"
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"}]
我尝试了一个很长很复杂的方法,只是在上面循环了很多次来组合散列,但我无法让它工作。一定有更好更简单的方法 我会这样写:
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}}
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
我会这样做
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
请向我们展示您的长复杂方法。谢谢!这真的很好用。它有多短给我留下了深刻的印象。
hash.to_enum.with_object…
而不是hash.each_with_object…
?您会选择hash
作为数组的名称吗?@CarySwoveland OP将数组分配给变量hash
。但这是一种误导。至于不使用带有对象的每个对象,我喜欢分解的对象。