この記事は、Elixir Advent Calendar 2023 シリーズ12 の10日目です
【本コラムは、4分で読め、4分で試せます】
piacere です、ご覧いただいてありがとございます
Elixirのマップは、キーが、アトムと文字列の2種類使えます
アトムキーのマップ
iex> user_a = %{id: :id000, name: "hoge", weight: 49}
iex> user_a.name
"hoge"
iex> user_a[:name]
"hoge"
iex> user_a |> Map.put(:name, "piacere")
%{id: :id000, name: "piacere", weight: 49}
文字列キーのマップ
iex> user_s = %{"id" => :id000, "name" => "hoge", "weight" => 49}
iex> user_s["name"]
"hoge"
iex> user_s |> Map.put("name", "piacere")
%{"id" => :id000, "name" => "piacere", "weight" => 49}
ただし、この2種類の間に互換性が無いため、扱いに困ることがありますので、相互変換の技をまとめておきます
文字列キーマップをアトムキーマップに変換
Map.new + String.to_atom
iex> user_s |> Map.new(&{String.to_atom(elem(&1, 0)), elem(&1, 1)})
%{id: :id000, name: "hoge", weight: 49}
iex> user_s |> Map.new(fn {k, v} -> {String.to_atom(k), v} end)
%{id: :id000, name: "hoge", weight: 49}
for + String.to_atom
iex> for {k, v} <- user_s, into: %{}, do: {String.to_atom(k), v}
%{id: :id000, name: "hoge", weight: 49}
Jason.encode! + Jason.decode! ※ただし要注意
アトムのバリューが、文字列に変化してしまうので注意
iex> user_s |> Jason.encode! |> Jason.decode!(keys: :atoms)
%{id: :id000, name: "hoge", weight: 49}
文字列キーマップをアトムキーマップに変換
Map.new + Atom.to_string
iex> user_a |> Map.new(fn {k, v} -> {Atom.to_string(k), v} end)
%{"id" => :id000, "name" => "hoge", "weight" => 49
iex> user_a |> Map.new(&{Atom.to_string(elem(&1, 0)), elem(&1, 1)})
%{"id" => :id000, "name" => "hoge", "weight" => 49}
for + Atom.to_string
iex> for {k, v} <- user_a, into: %{}, do: {Atom.to_string(k), v}
%{"id" => :id000, "name" => "hoge", "weight" => 49}
Jason.encode! + Jason.decode! ※ただし要注意
アトムのバリューが、文字列に変化してしまうので注意
iex> user_a |> Jason.encode! |> Jason.decode!
%{"id" => "id000", "name" => "hoge", "weight" => 49}