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"
    }]
4

2 に答える 2

5

注入はあなたの友達です:

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 }

上記の 2 つの方法は機能的に同等です。

最後に、これを本当にハッシュ配列スタイルにしたい場合は、次のようにします。

combined_keywords.collect{|(k,v)| {:keyword => k,  :total_value => v}}
于 2013-04-23T16:57:01.797 に答える
0

こんなものでもいいと思います

new_array = {}
array.each do |hsh|
  new_array[hsh[:keyword]] ||= 0
  new_array[hsh[:keyword]] += hsh[:total_value].to_i
end
于 2013-04-23T16:48:56.710 に答える