首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >嵌套哈希中相同键的求和键值对

嵌套哈希中相同键的求和键值对
EN

Stack Overflow用户
提问于 2014-03-17 21:40:14
回答 1查看 297关注 0票数 0

我有下面的散列-

代码语言:javascript
复制
array = [{:Air_Duct_Cleaning=>{:impressions=>92, :clicks=>2, :conversions=>0}, :Carpet_Cleaning=>{:impressions=>297, :clicks=>0, :conversions=>0}, :Brand_Terms=>{:impressions=>273, :clicks=>9, :conversions=>1}}, {:Brand_Terms=>{:impressions=>275, :clicks=>3, :conversions=>0}}, {:Air_Duct_Cleaning=>{:impressions=>51, :clicks=>1, :conversions=>0}, :Carpet_Cleaning=>{:impressions=>225, :clicks=>0, :conversions=>0}, :Brand_Terms=>{:impressions=>326, :clicks=>12, :conversions=>2}}]

我试图把相同键的键值对和起来。例如-

代码语言:javascript
复制
air_duct = array.map {|m| m[:Air_Duct_Cleaning]}.compact
=> [{:impressions=>92, :clicks=>2, :conversions=>0}, {:impressions=>51, :clicks=>1, :conversions=>0}]

air_duct_total = air_duct.inject{|x,y| x.merge(y){|a,b,c| b + c}}
=> {:impressions=>143, :clicks=>3, :conversions=>0}

但是,我需要在不知道第一级哈希键(不会知道:Air_Duct_Cleaning的键)的情况下这样做。我试图在数组中迭代,运行如下

代码语言:javascript
复制
key_groups = array.map {|m| m.map {|key, value| key}}

希望这能将每个键定位在:Air_Duct_Cleaning的位置上,我会得到这样的信息

代码语言:javascript
复制
[{:Air_Duct_Cleaning =>{:impressions=>92, :clicks=>2, :conversions=>0}, {:impressions=>51, :clicks=>1, :conversions=>0}, {:Carpet_Cleaning => {:impressions=>297, :clicks=>0, :conversions=>0}, {:impressions=>225, :clicks=>0, :conversions=>0}, {:Brand_Terms => {:impressions=>273, :clicks=>9, :conversions=>1}, {:impressions=>275, :clicks=>3, :conversions=>0}, {:impressions=>326, :clicks=>12, :conversions=>2}]

所以我可以用这样的方法

代码语言:javascript
复制
totals = key_groups.map {|m| m.inject{|x,y| x.merge(y){|a,b,c| b + c}}}

最终以

代码语言:javascript
复制
[{:Air_Duct_Cleaning => {:impressions=>143, :clicks=>3, :conversions=>0}, {:Carpet_Cleaning => {:impressions=>522, :clicks=>0, :conversions=>0}, {:Brand_Terms => {:impressions=>874, :clicks=>24, :conversions=>3}] 
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-03-17 22:09:17

这将产生所需的输出,而无需使用输入数组的显式键:

代码语言:javascript
复制
array = [
  { Air_Duct_Cleaning: { impressions: 92, clicks: 2, conversions: 0 }, Carpet_Cleaning: { impressions: 297, clicks: 0, conversions: 0 }, Brand_Terms: { impressions: 273, clicks: 9, conversions: 1 }},
  { Brand_Terms: { impressions: 275, clicks: 3, conversions: 0 }},
  { Air_Duct_Cleaning: { impressions: 51, clicks: 1, conversions: 0 }, Carpet_Cleaning: { impressions: 225, clicks: 0, conversions: 0 }, Brand_Terms: { impressions: 326, clicks: 12, conversions: 2 }},
]

result = array.reduce({}) do |o, hash|
  o.merge(hash) { |_, v1, v2| v1.merge(v2) { |_, vv1, vv2| vv1 + vv2 } }
end

p result
# {
#   :Air_Duct_Cleaning=>{:impressions=>143, :clicks=>3, :conversions=>0}, 
#   :Carpet_Cleaning=>{:impressions=>522, :clicks=>0, :conversions=>0}, 
#   :Brand_Terms=>{:impressions=>874, :clicks=>24, :conversions=>3}
# }
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22466036

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档