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>

テーブルのデータ元貼って、マップリスト作って、罫線作って、データ読み込み

スクリーンショット 2022-01-27 23.05.54

デフォルトのWebページを書き換える方法について。VSCode起動→ファイルパス を指定(cmd + shift + g)→後はいつものhtml。コンソール見ながらやると分かりやすい。

index.html.heex上では、<% ~ %>もしくは<%= ~ %>で囲んだ部分に、Elixirを書くことができるので、囲みタグをお忘れなく。

Web上での複数列データの「フィルタ」

|> Enum.filter( fn( record ) -> record[ "age" ] >= 43 end )

マップリストの後ろにEnum.filter()でフィルタがかけられる

スクリーンショット 2022-01-27 23.02.42

Web上での複数列データの「並べ替え」

|> Enum.sort( fn( record_current, record_next ) -> record_current[ "age" ] < record_next[ "age" ] end )

隣の行との"age"の値を比較して並べ替え。

スクリーンショット 2022-01-28 3.44.20

アルゴリズムとしてはバブルソートになるのかな。

致命的な不明点はなし。

参考: https://avinton.com/blog/2020/04/engineering-basics-sorting-algorithm/


この記事が気に入ったらサポートをしてみませんか?