2013-04-23 70 views
1
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" 
    }] 
+3

你不断地问[同](http://stackoverflow.com/ q/16157699/479863)[问题](http://stackoverflow.com/q/16156691/479863)以略微不同的形式重复。为什么不在其他变体的答案在这里工作? – 2013-04-23 17:10:03

+1

原始答案对我提供的数据是正确的。但是,我错误地提出了这个问题,并且解决方案没有为我的实际数据解决问题。我是ruby的新手,所以我不太了解如何为我的数据定制解决方案。 – mnort9 2013-04-23 17:17:08

+0

为了避免混淆,可能值得提及你以前的问题,并解释这个问题是如何不同的。乍一看这可能并不明显。一个简单的方法是将所需的输出放在第一位,然后再输入数据。 – tadman 2013-04-23 18:58:10

回答

5

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}} 
+1

'each_with_object'有时候比'inject'链少混乱,但结构几乎相同。 – tadman 2013-04-23 17:03:14

+0

谢谢,我总是忘记each_with_object。我已经扩大了答案以包含您的建议。 – 2013-04-23 17:08:49

+0

'inject'和'each_with_object'解决方案应该使用组合关键字作为关键字来返回单个散列?对我来说,它输出一个空的散列。 – mnort9 2013-04-23 17:10:51

0

我认为这可能是这样的

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