2014-03-04 69 views
0

我有散列的陣列是這樣的:如何合併ruby數組中的值?

a = [{:transaction_type=>"nationalvoice", :transaction_duration=>181}, {:transaction_type=>"nationalvoice", :transaction_duration=>60}, {:transaction_type=>"call", :transaction_duration=>200}] 

如何合併基於值TRANSACTION_TYPE = 「nationalvoice」?

我想要得到結果是這樣的:

a = [{:transaction_type=>"nationalvoice", :transaction_duration=>241}, {:transaction_type=>"call", :transaction_duration=>200}] 

該怎麼辦?

感謝

回答

2

之前如下活動:

a = [{:transaction_type=>"nationalvoice", :transaction_duration=>181}, {:transaction_type=>"nationalvoice", :transaction_duration=>60}, {:transaction_type=>"call", :transaction_duration=>200}] 


array_merge_hash = a.group_by { |hash1| hash1[:transaction_type] }.map do |_,v| 
    v.inject do |ele_hash2,ele_hash1| 
    ele_hash2.merge(ele_hash1) {|k,o,n| k == :transaction_duration ? o+n : o } 
    end 
end 
+1

+1,尼斯和清潔。 – falsetru

+1

不錯@Arup Rakshit – tardjo

+0

@falsetru謝謝你..做到了,也明白了你的觀點.. –

0

使用Enumerable#group_by

a = [ 
    {:transaction_type=>"nationalvoice", :transaction_duration=>181}, 
    {:transaction_type=>"nationalvoice", :transaction_duration=>60}, 
    {:transaction_type=>"call", :transaction_duration=>200}, 
] 

groups = a.group_by { |h| h[:transaction_type] } 
# => {"nationalvoice"=>[ 
#  {:transaction_type=>"nationalvoice", :transaction_duration=>181}, 
#  {:transaction_type=>"nationalvoice", :transaction_duration=>60} 
# ], 
# "call"=>[ 
#  {:transaction_type=>"call", :transaction_duration=>200} 
# ]} 

merged_hashes = groups.map { |k, hashes| 
    total = hashes.map { |h| h[:transaction_duration] }.reduce(:+) 
    {transaction_type: k, transaction_duration: total} # merged hash 
} 

# => [{:transaction_type=>"nationalvoice", :transaction_duration=>241}, 
#  {:transaction_type=>"call", :transaction_duration=>200}] 
+0

很棒,作品...謝謝@falsetru – tardjo

0

你也可以使用Enumerable#each_with_object

a =[{:transaction_type=>"nationalvoice", :transaction_duration=>181}, {:transaction_type=>"nationalvoice", :transaction_duration=>60}, {:transaction_type=>"call", :transaction_duration=>200}] 
n = a.each_with_object({}) do |obj,hsh| 
    hsh[obj[:transaction_type]] ? hsh[obj[:transaction_type]][:transaction_duration]+= obj[:transaction_duration].to_i : hsh[obj[:transaction_type]]=obj 
end 
print n.values 

# [{:transaction_type=>"nationalvoice", :transaction_duration=>241}, {:transaction_type=>"call", :transaction_duration=>200}]