[Ruby]ネストされたHash(連想配列)をフラット(１階層）にする①

最近の勉強で学んだ事を、ノート代わりにまとめていきます。
主に自分の学習の流れを振り返りで残す形なので色々、省いてます。
Webエンジニアの諸先輩方からアドバイスやご指摘を頂けたらありがたいです！

#Arra(配列)とHash（連想配列)
・[ChefTips: RubyのArray(配列)とHash(連想配列)入門](https://qiita.com/kentarok/items/5d38c3f7df37a7396ef9/)
###Array(配列) とは
>Arrayは、イメージしやすく言うと複数のValue(値)が入っている入れ物です。順番(添字)をつけてValue(値)を管理します。順番は1からではなく、0から始まります。

```ruby
# Array family_array を定義
family_array = [ "sazae", "masuo", "tarao" ]      
```

###Hash(連想配列) とは
>ArrayはValue(値)を管理するために添字を使いますが、Hashは添字の代わりにKeyを使います。KeyとValueのペアは "=>"（ハッシュロケット) で表現します。
Keyは数字と違いなんらかの意味を持つので、コードが読みやすくなるという利点があります。下のサンプルコードを見てください。なんとなく、sazaeが妻で、mazuoが夫で、taraoが子供であることがコードを呼んでいる人に伝わりますよね。

```ruby
# Hash family_hash を定義
family_hash = { "tsuma" => "sazae", "otto" => "masuo", "kodomo" => "tarao" }  
```

#今回やりたい事
こんなネストされたHashがあるとします、これをフラット(１階層）にしていきます！
・[ネストがあるhashの、keyとvalueの取得について](https://teratail.com/questions/85334/)

これを

```ruby
hash =
{:basic=>[:name, :gender, :birthday],
 :history=>
  [:primary, :clinic, :status, :age],
 :test=>
  [:cycle,
   :history_test,
   :culture_test,
   :math_test,
   {:score=>[], :history_score=>[], :culuture_score=>[], :math_score=>[]}
  ],
 :tarou_infomation=>[:house, :address,:favorite, {:levels=>[], :experience=>[]}],
 }
```

こうしたい！パターンです！

```ruby
hash =
[
:name,
:gender,
:birthday,
:primary, 
:clinic, 
:status, 
:age,
:cycle,
:history_test,
:culture_test,
:math_test,
:score, 
:history_score, 
:culuture_score, 
:math_score,
:house, 
:address,
:favorite,
:levels, 
:experience
]
```

#色々試してみる
キーだけを消してバリューの要素だけとる。
・[Rubyでハッシュオブジェクトからキーや値を取り出す方法【初心者向け】](https://techacademy.jp/magazine/19786/)
・[ハッシュを配列に変換する](https://scrapbox.io/rubytips/%E3%83%8F%E3%83%83%E3%82%B7%E3%83%A5%E3%82%92%E9%85%8D%E5%88%97%E3%81%AB%E5%A4%89%E6%8F%9B%E3%81%99%E3%82%8B/)

```ruby
pry(main)> hash.values
=> [[:name, :gender, :birthday],
 [:primary, :clinic, :status, :age],
 [:cycle, :history_test, :culture_test, :math_test, {:score=>[], :history_score=>[], :culuture_score=>[], :math_score=>[]}],
 [:house, :address, :favorite, {:levels=>[], :experience=>[]}]]
```

次はこれをフラットに！
flattenメソッドを使用して配列を平坦化する。
・[flatten, flatten! (Array) - Rubyリファレンス](https://docs.ruby-lang.org/ja/latest/method/Array/i/flatten.html/)

```ruby
pry(main)> hash.values.flatten
=> [:name,
 :gender,
 :birthday,
 :primary,
 :clinic,
 :status,
 :age,
 :cycle,
 :history_test,
 :culture_test,
 :math_test,
 {:score=>[], :history_score=>[], :culuture_score=>[], :math_score=>[]},
 :house,
 :address,
 :favorite,
 {:levels=>[], :experience=>[]}]
```

よし！フラットにできたけどHashが〜

ちなみにeach_with_objectを使えば一発でできました。
・[Ruby: injectとeach_with_objectをうまく使い分ける](https://techracho.bpsinc.jp/hachi8833/2018_07_24/58807/)

```ruby
pry(main)> hash.each_with_object([]) {|(k, v), array| array.concat v}
=> [:name,
 :gender,
 :birthday,
 :primary,
 :clinic,
 :status,
 :age,
 :cycle,
 :history_test,
 :culture_test,
 :math_test,
 {:score=>[], :history_score=>[], :culuture_score=>[], :math_score=>[]},
 :house,
 :address,
 :favorite,
 {:levels=>[], :experience=>[]}]
```


これは配列の中に連想配列がネストされているので
連想配列には別の対処が必要です。

配列にしたいHashをインデックスで指定

```ruby
pry(main)> hash.values.flatten[11]
=> {:score=>[], :history_score=>[], :culuture_score=>[], :math_score=>[]}
```
これをキーだけの配列にはできる

```ruby
 pry(main)> hash.values.flatten[11].keys
=> [:score, :history_score, :culuture_score, :math_score]
```

ゴリ押しで新しい変数にhashの要素だけdelete_atメソッドで削除してkesで作成した配列をconcatメソッドで１つの配列に結合する方法もありますがあまりしたくない。
・[【Ruby】配列の要素を追加・削除](https://qiita.com/tomokichi_ruby/items/b0bfcadf8445d5253ce6/)
・[Rubyで複数の配列を１つの配列に結合するために色々やってみた](https://qiita.com/na1412/items/65f883896c85011d6509/)

しかも、そこそこ記述が多くなりそうなのでメソッドにするか〜
という事で次回は、Hash(連想配列)をフラット(１階層）にする記述をメソッドにしていきます！
・[[Ruby]ネストされたHash(連想配列)をフラット(１階層）にする②](https://qiita.com/hirokik-0076/items/b89edd87e7c20f6a56e5/)


#参考記事
・[扱いにくい階層の深いHashをフラット(1階層)にする](https://qiita.com/okappy/items/72625a3e9437d70bc7c4/)
・[how to permit an array with strong parameters](https://stackoverflow.com/questions/16549382/how-to-permit-an-array-with-strong-parameters/30285592#30285592/)
・[Ruby :: ハッシュを配列に変換する](http://tm.root-n.com/programming:ruby:etc:hash2array/)
・[[Ruby]配列をマージ・結合する](https://qiita.com/hkengo/items/68e230ae6e1f7b80c778/)
・[【Ruby入門】defについてまとめてみました(return,self,defined)](https://www.sejuku.net/blog/19275/)