LoginSignup
5
1
記事投稿キャンペーン 「2024年!初アウトプットをしよう」

【TIPS】マップリストのアトムキーと文字列キーの相互変換(キーワードリストのリストもついでに)

Posted at

この記事は、Elixir Advent Calendar 2023 シリーズ13 の11日目です


【本コラムは、3分で読め、3分で試せます】

piacere です、ご覧いただいてありがとございます :bow:

下記コラムで、マップのアトムキーと文字列キーの相互変換を扱いました

マップリストでも同様のことを行いたいと思います

元データは下記の通りです

アトムキーのマップリスト
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}
]
5
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
1