こんにちは!
プログラミング未経験文系出身、Elixirの国に迷い込んだ?!見習いアルケミストのaliceと申します。
今回はマップリストの要素を検索する方法を学びましたのでまとめます。
目次
1.Ectoスキーマからパターンマッチを使用してパラメータを取り出す
2.Ectoスキーマからパラメータを取り出して更新する(iex内のみ)
3.Enum.mapの紹介
4.Enum.filterの紹介
5.String.contains?の紹介(本記事)
6.Enum.intoの紹介
7.Map.putの紹介
8.(番外編)元データがマップ→リスト→マップのもう一段深い入れ子構造だったらどうするか?(Map.getの紹介)
目的
リストの要素がマップ(あるいはその逆)になっている場合に値を取り出して操作できるようになりたい。
実行環境
Windows 11 + WSL2 + Ubuntu 22.04
Elixir v1.14.3
Erlang v26.0.2
Phoenix v1.7.10
今回やりたいこと
前回、Enum.filterで要素を一つずつ取り出して条件に合ったものだけ取り出す方法を学んだので、検索条件に文字列検索を入れてみたい。
results = [{1, "hogehoge"}, {4, "fugafuga"}, {5, "piyopiyo"}]
Enum.filter(results, fn {id, _name} -> id == 5 end)
[{5, "piyopiyo"}]
String.contains?とは
第一引数の中に第二引数の文字列を含むかをチェックする。
これをEnum.filterの検索条件に入れこみます。
Enum.filter(results, fn {_id, name} -> String.contains?(name, "piyopiyo") end)
[{5, "piyopiyo"}]
Enum.filter(results, fn {_id, name} -> String.contains?(name, "iy") end)
[{5, "piyopiyo"}]
部分一致で検索していますね。
(余談)完全一致検索の場合
==
を使うと完全一致検索になります。
Enum.filter(results, fn {_id, name} -> name == "piyopiyo" end)
[{5, "piyopiyo"}]
Enum.filter(results, fn {_id, name} -> name == "iy" end)
[]
(途中経過)元データからここまでをパイプでつなげる
users
|> Enum.map(&{&1.id, &1.name})
|> Enum.filter(fn {_id, name} -> String.contains?(name, "piyopiyo") end)
[{5, "piyopiyo"}]
~Elixirの国のご案内~
↓Elixirって何ぞや?と思ったらこちらもどぞ。Elixirは先端のアレコレをだいたい全部できちゃいます
↓ゼロからElixirを始めるなら「エリクサーチ」がおすすめ!私もエンジニア未経験から学習中です。
↓We Are The Alchemists, my friends!1
Elixirコミュニティは本当に優しくて温かい人たちばかり!
私が挫折せずにいられるのもこの恵まれた環境のおかげです。
まずは気軽にコミュニティを訪れてみてください。2
-
@torifukukaiouさんのAwesomeな名言をお借りしました。Elixirコミュニティを一言で表すと、これに尽きます。 ↩