将哈希值与相同的符号值组合在一起

mno*_*rt9 1 ruby arrays ruby-on-rails

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"
    }]
Run Code Online (Sandbox Code Playgroud)

我正在尝试使用相同的: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"
    }]
Run Code Online (Sandbox Code Playgroud)

Dav*_* S. 5

注入是你的朋友:

combined_keywords = array.inject(Hash.new(0)){|acc, oh| acc[oh[:keyword]] += oh[:total_value].to_i ; acc }
Run Code Online (Sandbox Code Playgroud)

或者,each_with_object在这种情况下,该方法可能更具可读性:

combined_keywords = array.each_with_object(Hash.new(0)){|oh, newh| newh[oh[:keyword]] += oh[:total_value].to_i }
Run Code Online (Sandbox Code Playgroud)

上述两种方法在功能上是等效的.

最后,如果你真的希望它采用哈希数组样式,那么这将使你得到:

combined_keywords.collect{|(k,v)| {:keyword => k,  :total_value => v}}
Run Code Online (Sandbox Code Playgroud)