この記事は、Elixir Advent Calendar 2023 シリーズ13 の11日目です
【本コラムは、3分で読め、3分で試せます】
piacere です、ご覧いただいてありがとございます
下記コラムで、マップのアトムキーと文字列キーの相互変換を扱いました
マップリストでも同様のことを行いたいと思います
元データは下記の通りです
アトムキーのマップリスト
users_a = [
%{id: :id000, name: "hoge", weight: 49},
%{id: :id001, name: "foo", weight: nil},
%{id: :id002, name: "fuga", weight: 33}
]
文字列キーのマップリスト
users_s = [
%{"id" => :id000, "name" => "hoge", "weight" => 49},
%{"id" => :id001, "name" => "foo", "weight" => nil},
%{"id" => :id002, "name" => "fuga", "weight" => 33}
]
ついでに、キーワードリストのリストもアトムキー/文字列キーのマップリストへの変換を行います(元データは下記)
キーワードリストのリスト
users_kl = [
[id: :id000, name: "hoge", weight: 49],
[id: :id001, name: "foo", weight: nil],
[id: :id002, name: "fuga", weight: 33]
]
マップリストのアトムキー → 文字列キーに変換
iex> users_a |> Enum.map(& Map.new(&1, fn {k, v} -> {Atom.to_string(k), v} end))
[
%{"id" => :id000, "name" => "hoge", "weight" => 49},
%{"id" => :id001, "name" => "foo", "weight" => nil},
%{"id" => :id002, "name" => "fuga", "weight" => 33}
]
マップリストの文字列キー → アトムキー
iex> users_s |> Enum.map(& Map.new(&1, fn {k, v} -> {String.to_atom(k), v} end))
[
%{id: :id000, name: "hoge", weight: 49},
%{id: :id001, name: "foo", weight: nil},
%{id: :id002, name: "fuga", weight: 33}
]
キーワードリストのリスト → アトムキーマップリスト
iex> users_kl |> Enum.map(& Enum.into(&1, %{}))
[
%{id: :id000, name: "hoge", weight: 49},
%{id: :id001, name: "foo", weight: nil},
%{id: :id002, name: "fuga", weight: 33}
]
キーワードリストのリスト → 文字列キーマップリスト
iex> users_kl |> Enum.map(& Map.new(&1, fn {k, v} -> {Atom.to_string(k), v} end))
[
%{"id" => :id000, "name" => "hoge", "weight" => 49},
%{"id" => :id001, "name" => "foo", "weight" => nil},
%{"id" => :id002, "name" => "fuga", "weight" => 33}
]