この記事は、Elixir Advent Calendar 2024 シリーズ7 の5日目です
【本コラムは、4分で読め、4分で試せます】
piacere です、ご覧いただいてありがとございます
マップリストからキーで値を抜き出すには、こんな感じです(Map.valuesのマップリスト版みたいなものです)
key = "name"
[%{"name" => "c2", "age" => 21}, %{"name" => "c4", "age" => 42}]
|> Enum.map(& &1[key])
結果:["c2", "c4"]
ただし、キーが欠けている場合は、nilが返ってしまいます(その仕様でOKというケースもありますが)
key = "name"
[%{"age" => 21}, %{"name" => "c4", "age" => 42}]
|> Enum.map(& &1[key])
結果:[nil, "c4"]
なので、キー欠け対策をしたいなら、少し工夫が必要です
key = "name"
[%{"age" => 21}, %{"name" => "c4", "age" => 42}]
|> Enum.map(& &1[key])
|> Enum.reject(& &1 == nil)
結果:["c4"]
なお、上の方法だと、キー欠けか、値がnilかを厳密には区別できないため、別の工夫が必要です
key = "name"
[%{"age" => 21}, %{"name" => "c4", "age" => 42}]
|> Enum.map(& Map.take(&1, [key]))
|> Enum.reject(& &1 == %{})
|> Enum.map(& &1[key])
結果:["c4"]
key = "name"
[%{"name" => nil, "age" => 21}, %{"name" => "c4", "age" => 42}]
|> Enum.map(& Map.take(&1, [key]))
|> Enum.reject(& &1 == %{})
|> Enum.map(& &1[key])
結果:[nil, "c4"]