尝试迭代哈希,提取唯一键并添加值

时间:2012-06-25 19:08:11

标签: ruby loops hash iterator aggregate-functions

我有一个Mysql2::Result,其中有一堆行。结果的格式如下:

{"thing_name" => "email",   "count(*)" => 1000}
{"thing_name" => "email",   "count(*)" => 800}
{"thing_name" => "ads",     "count(*)" => 500}
{"thing_name" => "display", "count(*)" => 700}

我的目标是遍历所有这些并创建一个新哈希,其中包含每个密钥之一以及它们的计数总和作为与该密钥关联的值。

我可以成功迭代并将“thing_name”放在一个数组中并对它们运行.uniq以将重复项折叠成一个条目,但我无法弄清楚如何关联这些值并进行相应的数学运算在他们。或者如何将其作为哈希。

这是我到目前为止的代码:

thing_type = results.collect {|row| row["thing_name"]}
thing_type = thing_type.uniq

非常感谢任何帮助。

1 个答案:

答案 0 :(得分:4)

尝试这样的事情:

 # Provide a default value of zero for unknown keys
 counts = Hash.new { |hash,key| hash[key] = 0 }

 result.each do |row|
     counts[ row["thing_name"] ] += row["count(*)"]
 end

当您将块传递给Hash.new时,只要您第一次尝试获取未知密钥(例如,通过在不存在的密钥上执行counts[...] += ...),它就会使用该块。 Ruby将调用您的块并作为现有哈希对象的参数以及您尝试设置的密钥传入。