{1=>{2=>{3=>"a"}}} みたいな多重階層ハッシュを簡単に扱えるようにHashをちょっと改良したクラスを作ってみました。
ruby
class MyHash < Hash
def [](key)
if has_key? key
super
else
self[key] = self.class.new
end
end
end
ちょっと雑ですが、以下のようにさくっと動きます。
irb
my_hash = MyHash.new
my_hash[1][2][3] = "a"
puts my_hash
=> {1=>{2=>{3=>"a"}}}
ループするとこんな感じ
my_hash = MyHash.new
data = [
[2018, 3, 20, "◯"],
[2018, 3, 21, "☓"],
[2018, 3, 22, "◯"],
[2018, 4, 20, "◯"],
[2018, 4, 21, "◯"],
[2018, 4, 22, "☓"],
[2019, 4, 20, "◯"],
[2019, 4, 21, "◯"],
[2019, 4, 22, "☓"],
].each do |(a,b,c,d)|
my_hash[a][b][c] = d
end
puts my_hash
=> {2018=>{3=>{20=>"◯", 21=>"☓", 22=>"◯"}, 4=>{20=>"◯", 21=>"◯", 22=>"☓"}}, 2019=>{4=>{20=>"◯", 21=>"◯", 22=>"☓"}}}