🙄
【Ruby】 配列内のハッシュで同じキーの値を合算(inject、merge)
目的
- 同じキーのものを合算したい
以下のような結果を目指します
やりたいこと
data = [
{"total_job"=>10, "total_recruitment"=>100},
{"total_job"=>20, "total_recruitment"=>200},
{"total_job"=>30, "total_recruitment"=>300},
]
# 上記のデータで同じキーのものを合算
#=> {"total_job"=>60, "total_recruitment"=>600}
完成形
merge_data = data.inject do |v1, v2|
v1.merge(v2) do |_key, oldval, newval|
oldval + newval
end
end
- 使用したメソッド
- inject: 配列等の要素を一つずつ繰り返してブロック内で処理
- merge: 同じキーを持つ値を結合
- 参考:https://docs.ruby-lang.org/ja/latest/method/Hash/i/merge.html
- ブロック付きの場合、ブロックを呼び出してその返す値を重複キーに対応する値にします。
デバッグコードを入れて処理の中身を確認を確認。
デバッグ
data = [
{"total_job"=>10, "total_recruitment"=>100},
{"total_job"=>20, "total_recruitment"=>200},
{"total_job"=>30, "total_recruitment"=>300},
]
merge_data = data.inject do |v1, v2|
puts "🌟🌟🌟🌟v1🌟🌟🌟🌟"
puts v1
puts "🌟🌟🌟🌟v2🌟🌟🌟🌟"
puts v2
v1.merge(v2) do |_key, oldval, newval|
puts "🌟🌟🌟🌟_key🌟🌟🌟🌟"
puts _key
puts "🌟🌟🌟🌟oldval🌟🌟🌟🌟"
puts oldval
puts "🌟🌟🌟🌟newval🌟🌟🌟🌟"
puts newval
puts 🌟🌟🌟🌟oldval + newval🌟🌟🌟🌟
puts oldval + newval
oldval + newval
end
end
デバッグ結果
🌟🌟🌟🌟v1🌟🌟🌟🌟
# 一つ目のハッシュ
{"total_job"=>10, "total_recruitment"=>100}
🌟🌟🌟🌟v2🌟🌟🌟🌟
# 二つ目のハッシュ
{"total_job"=>20, "total_recruitment"=>200}
🌟🌟🌟🌟_key🌟🌟🌟🌟
total_job
🌟🌟🌟🌟oldval🌟🌟🌟🌟
# 一つ目のハッシュ(total_job)
10
🌟🌟🌟🌟newval🌟🌟🌟🌟
# 二つ目のハッシュ(total_job)
20
🌟🌟🌟🌟oldval + newval🌟🌟🌟🌟
# 一つ目のハッシュ + 二つ目のハッシュ(total_job)
30
🌟🌟🌟🌟_key🌟🌟🌟🌟
total_recruitment
🌟🌟🌟🌟oldval🌟🌟🌟🌟
# 一つ目のハッシュ(total_recruitment)
100
🌟🌟🌟🌟newval🌟🌟🌟🌟
# 二つ目のハッシュ(total_recruitment)
200
🌟🌟🌟🌟oldval + newval🌟🌟🌟🌟
# 一つ目のハッシュ + 二つ目のハッシュ(total_recruitment)
300
🌟🌟🌟🌟v1🌟🌟🌟🌟
# 一つ目のハッシュ + 二つ目のハッシュ合算結果
{"total_job"=>30, "total_recruitment"=>300}
🌟🌟🌟🌟v2🌟🌟🌟🌟
# 三つ目のハッシュ
{"total_job"=>30, "total_recruitment"=>300}
🌟🌟🌟🌟_key🌟🌟🌟🌟
total_job
🌟🌟🌟🌟oldval🌟🌟🌟🌟
# 一つ目のハッシュ + 二つ目のハッシュ合算結果(total_job)
30
🌟🌟🌟🌟newval🌟🌟🌟🌟
# 三つ目のハッシュ(total_job)
30
🌟🌟🌟🌟oldval + newval🌟🌟🌟🌟
# 一つ目のハッシュ + 二つ目のハッシュ合算結果 + 三つ目のハッシュ(total_job)
60
🌟🌟🌟🌟_key🌟🌟🌟🌟
total_recruitment
🌟🌟🌟🌟oldval🌟🌟🌟🌟
# 一つ目のハッシュ + 二つ目のハッシュ合算結果(total_recruitment)
300
🌟🌟🌟🌟newval🌟🌟🌟🌟
# 三つ目のハッシュ(total_recruitment)
300
🌟🌟🌟🌟oldval + newval🌟🌟🌟🌟
# 一つ目のハッシュ + 二つ目のハッシュ合算結果 + 三つ目のハッシュ(total_recruitment)
600
# 結果
#=> {"total_job"=>60, "total_recruitment"=>600}
完成形②
data = [
{"total_job"=>10, "total_recruitment"=>100},
{"total_job"=>20, "total_recruitment"=>200},
{"total_job"=>30, "total_recruitment"=>300},
]
{}.merge(*target) { |_key, v1, v2| v1 + v2 }
デバッグしたい場合は以下の形
デバッグ用
{}.merge(*data) do |_key, v1, v2|
puts "🌟🌟🌟🌟key🌟🌟🌟🌟"
puts _key
puts "🌟🌟🌟🌟v1🌟🌟🌟🌟"
puts v1
puts "🌟🌟🌟🌟v2🌟🌟🌟🌟"
puts v2
puts "🌟🌟🌟🌟v1 + v2🌟🌟🌟🌟"
puts v1 + v2
v1 + v2
end
Discussion