具有相同符号值的组合哈希值
问题描述:
array =
[ {
:keyword => "A",
:total_value => "10"
},
{
:keyword => "B",
:total_value => "5"
},
{
:keyword => "C",
:total_value => "15"
},
{
:keyword => "B",
:total_value => "6"
},
{
:keyword => "A",
:total_value => "50"
},
{
:keyword => "D",
:total_value => "40"
},
{
:keyword => "A",
:total_value => "30"
}]
我正在尝试合并具有相同:keyword
值的哈希值。通过巩固,我的意思是结合:total_value
。例如,在整合...具有相同符号值的组合哈希值
new_array =
[ {
:keyword => "A",
:total_value => "90"
},
{
:keyword => "B",
:total_value => "11"
},
{
:keyword => "C",
:total_value => "15"
},
{
:keyword => "D",
:total_value => "40"
}]
答
inject是你的朋友:
combined_keywords = array.inject(Hash.new(0)){|acc, oh| acc[oh[:keyword]] += oh[:total_value].to_i ; acc }
另外,该each_with_object
方法可能会更在这种情况下可读:
combined_keywords = array.each_with_object(Hash.new(0)){|oh, newh| newh[oh[:keyword]] += oh[:total_value].to_i }
上述两种方法在功能上是等效的。
最后,如果你真的想这是数组的哈希值的风格,这将让你有:
combined_keywords.collect{|(k,v)| {:keyword => k, :total_value => v}}
答
我认为这可能是这样的
new_array = {}
array.each do |hsh|
new_array[hsh[:keyword]] ||= 0
new_array[hsh[:keyword]] += hsh[:total_value].to_i
end
+0
这样的输出看起来更像'{“A”=> 90,“B”=> 11,“C”=> 15,“D”=> 40}',不是吗?也许你会需要另一行来遍历'new_array'中的键和值来生成所需的散列数组。 – pjmorse 2013-04-23 16:55:20
你不断地问[同](http://*.com/ q/16157699/479863)[问题](http://*.com/q/16156691/479863)以略微不同的形式重复。为什么不在其他变体的答案在这里工作? – 2013-04-23 17:10:03
原始答案对我提供的数据是正确的。但是,我错误地提出了这个问题,并且解决方案没有为我的实际数据解决问题。我是ruby的新手,所以我不太了解如何为我的数据定制解决方案。 – mnort9 2013-04-23 17:17:08
为了避免混淆,可能值得提及你以前的问题,并解释这个问题是如何不同的。乍一看这可能并不明显。一个简单的方法是将所需的输出放在第一位,然后再输入数据。 – tadman 2013-04-23 18:58:10