Excelから関数型言語マスター2回目:データ列の”抽出”、”Web表示”... をやってみた
元記事様: https://qiita.com/piacerex/items/b7787580fce5f148242f
前提条件~マップリストの作成
このあとの処理に使うdataという名前のマップリストの作成
iex()> data = [
...()> %{ "name" => "en-pedasi", "age" => 49, "team" => "Delight Systems", "position" => "CEO" },
...()> %{ "name" => "zacky", "age" => 45, "team" => "Kitakyushu University", "position" => "Associate professor" },
...()> %{ "name" => "tsuchiro", "age" => 34, "team" => "karabiner inc", "position" => "Tech lead" },
...()> %{ "name" => "piacere", "age" => 43, "team" => "DigiDockConsulting", "position" => "CTO" }
...()> ]
[
%{
"age" => 49,
"name" => "en-pedasi",
"position" => "CEO",
"team" => "Delight Systems"
},
%{
"age" => 45,
"name" => "zacky",
"position" => "Associate professor",
"team" => "Kitakyushu University"
},
%{
"age" => 34,
"name" => "tsuchiro",
"position" => "Tech lead",
"team" => "karabiner inc"
},
%{
"age" => 43,
"name" => "piacere",
"position" => "CTO",
"team" => "DigiDockConsulting"
}
]
→【リスト】 行の要素の一覧、[]で要素をくくる
→【マップ】列の要素の一覧、%{}で要素をくくる
→【マップリスト】上記の例のようにマップをリストで括ったもの。正規表現した表、みたいなものだろう。
Enum.map() 1要素のみ抽出
前回のEnum.filter()と同じく、リスト内の要素の1つ1つの値を変数として -> の後ろの処理に渡す
iex()> data |> Enum.map( fn( record ) -> record[ "name" ] end )
["en-pedasi", "zacky", "tsuchiro", "piacere"]
レコード全体からの "name" 列だけの抽出。
Enum.map() 2要素以上の抽出
iex()> data |> Enum.map( fn( record ) -> %{ "name" => record[ "name" ] } end )
[
%{"name" => "en-pedasi"},
%{"name" => "zacky"},
%{"name" => "tsuchiro"},
%{"name" => "piacere"}
]
for 構文もあるにはあるが…
iex(4)> for record <- data do %{ "name" => record[ "name" ], "age" => record[ "age" ] } end
[
%{"age" => 49, "name" => "en-pedasi"},
%{"age" => 45, "name" => "zacky"},
%{"age" => 34, "name" => "tsuchiro"},
%{"age" => 43, "name" => "piacere"}
]
Elixirでは繰り返し処理の扱いにならないので、「Web表示のような、出力したら、それ以降で出力結果を使うことが無いケース」にのみ使うこと。
Web表示してみよう
<%
data =
[
%{ "name" => "enぺだーし", "age" => 49, "team" => "有限会社デライトシステムズ", "position" => "代表取締役、性能探求者" },
%{ "name" => "ざっきー", "age" => 45, "team" => "公立大学法人 北九州市立大学", "position" => "准教授、カーネルハッカー" },
%{ "name" => "つちろー", "age" => 34, "team" => "カラビナテクノロジー株式会社", "position" => "リードエンジニア、アプリマイスター" },
%{ "name" => "piacere", "age" => 43, "team" => "株式会社DigiDockConsulting", "position" => "常務取締役CTO、福岡Elixirプログラマ、重力プログラマ、技術顧問" }
]
%>
<table border="1">
<%= for record <- data do %>
<tr>
<td><%= record[ "name" ] %></td>
<td><%= record[ "age" ] %></td>
<td><%= record[ "team" ] %></td>
<td><%= record[ "position" ] %></td>
</tr>
<% end %>
</table>
テーブルのデータ元貼って、マップリスト作って、罫線作って、データ読み込み
デフォルトのWebページを書き換える方法について。VSCode起動→ファイルパス を指定(cmd + shift + g)→後はいつものhtml。コンソール見ながらやると分かりやすい。
index.html.heex上では、<% ~ %>もしくは<%= ~ %>で囲んだ部分に、Elixirを書くことができるので、囲みタグをお忘れなく。
Web上での複数列データの「フィルタ」
|> Enum.filter( fn( record ) -> record[ "age" ] >= 43 end )
マップリストの後ろにEnum.filter()でフィルタがかけられる
Web上での複数列データの「並べ替え」
|> Enum.sort( fn( record_current, record_next ) -> record_current[ "age" ] < record_next[ "age" ] end )
隣の行との"age"の値を比較して並べ替え。
アルゴリズムとしてはバブルソートになるのかな。
致命的な不明点はなし。
参考: https://avinton.com/blog/2020/04/engineering-basics-sorting-algorithm/
この記事が気に入ったらサポートをしてみませんか?