簡體   English   中英

如何在ruby中合並哈希數組中的值?

[英]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

使用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}]

您還可以使用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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM