🙄

【Ruby】 配列内のハッシュで同じキーの値を合算(inject、merge)

2022/02/27に公開

目的

  • 同じキーのものを合算したい

以下のような結果を目指します

やりたいこと
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

デバッグコードを入れて処理の中身を確認を確認。

デバッグ
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