LoginSignup
1
0

More than 3 years have passed since last update.

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

Last updated at Posted at 2020-01-15

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

Hash(連想配列)を取り除く

前回からの続きです!
[Ruby]ネストされたHash(連想配列)をフラット(1階層)にする①

ここからやっていきたいのは配列に入っている要素がHashだったら変数に変換する処理します。
要は、配列に入っている要素をチェックしてHashだったら特定の処理をしたら良いのです。

#配列の場合
family_array = [ "sazae", "masuo", "tarao" ]      
pry(main)> family_array.is_a?(Hash)
=> false

#連想配列の場合
family_hash = { "tsuma" => "sazae", "otto" => "masuo", "kodomo" => "tarao" }
pry(main)> family_hash.is_a?(Hash)
=> true

Hashかどうかを判定しつつ任意の{key: value}を持っているかどうかを判定するメソッドを作った

配列の要素を確認する処理
配列に対する繰り返し
Ruby eachが初心者でも書ける!知っていると便利な知識とは?

array = hash.each_with_object([]) {|(k, v), array| array.concat v}
pry(main)> i=0
pry(main)> array.each do |var|
pry(main)*   if var.is_a?(Hash)
pry(main)*     params = var.keys
pry(main)*     array.delete_at(i)
pry(main)*     array.concat(params)
pry(main)*     print(array)
pry(main)*   end
pry(main)*   i=i+1;
pry(main)* end
=> [:name,
 :gender,
 :birthday,
 :primary,
 :clinic,
 :status,
 :age,
 :cycle,
 :history_test,
 :culture_test,
 :math_test,
 :house,
 :address,
 :favorite,
 :score,
 :history_score,
 :culuture_score,
 :math_score,
 :levels,
 :experience]

できた!

メソッドにしていく!

フラットにする為の処理をメソッドにしていきます!
Rubyのメソッドについて

メソッドとは

メソッドは色々な処理をひとつにまとめて定義して、何度も再利用(実行)できるようにしたものです。

def メソッドの名前
  やりたい処理
end

ではメソッド化していきます!

def flat_params(array)
  i=0
  array.each do |var|
     if var.is_a?(Hash)
       params = var.keys
       array.delete_at(i)
       array.concat(params)
     end
     i=i+1;
  end
end

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

これでフラットにできました!

参考記事

class Array
【Ruby入門】ハッシュ(hash)をeachで取り出す!その他ハッシュの応用について
Rubyで配列の要素数を調べるための3つのメソッドまとめ
【Ruby入門】Rubyにおけるメソッド(関数)の使い方

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0