🧪

値のリストを別のbool値リストを使ってフィルターしたい

2022/01/31に公開

Slackのelixir.jpの中で出た質問に対する私の回答が我ながらイケてる気がしたので自分向けの備忘録として残しておきます。

Enum.zip_with/3
https://hexdocs.pm/elixir/Enum.html#zip_with/3

iex> bool_list = [true, false, true, false, false]
iex> words = ["apple", "banana", "lemon", "orange", "pineapple"]
iex> Enum.zip_with(words, bool_list, fn w, b -> if b, do: w, else: nil end) |> Enum.filter(&(&1))
["apple", "lemon"]

通常のEnum.zip/2と異なり、Enum.zip_with/3 は戻り値のリストに詰める値を関数を使って操作できるので、bool値を省いたりfalseの値を好きな値に設定してリストを構築できます。
不要な値は nil にしておくことで、パイプ先の Enum.filter(&(&1)) で除外することができます。
引数に渡すリストの項目数が異なっている場合、余剰分は結果に含まれませんでした。

special thanks: ymnさん

Discussion