[英]how to merge value inside array of hash in 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}]
怎么辦?
謝謝你
請執行以下操作:
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
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}]
您還可以使用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}]
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.