プログラミングにおいて、連想配列のリストをなんらかのプロパティをキーにした連想配列に変換したいということはよくあります。
ちょうど下記のようなイメージです。Elixirにおける連想配列はMapですね。
# before
users = [
  %{id: 1, name: "foo"},
  %{id: 2, name: "bar"},
  %{id: 3, name: "baz"},
]
# after
user_map = %{
  1 => %{id: 1, name: "foo"},
  2 => %{id: 2, name: "bar"},
  3 => %{id: 3, name: "baz"},
}このエントリでは、Elixirでマップのリストをマップに変換する方法を紹介します。
 Elixirでリストをマップに変換するにはEnum.reduce/3を使い、初期値に空のマップ%{}を与えてマップを更新していきます。  
users = [
  %{id: 1, name: "foo"},
  %{id: 2, name: "bar"},
  %{id: 3, name: "baz"},
]
users |> Enum.reduce(%{}, fn user, acc ->
  acc |> Map.put(user.id, user)
end)
# %{
#   1 => %{id: 1, name: "foo"},
#   2 => %{id: 2, name: "bar"},
#   3 => %{id: 3, name: "baz"}
# }下記のように匿名関数(無名関数)の省略記法を使うと、さらに短く書くことができます。
 この&記号のことを「キャプチャ演算子」と言います。  
users |> Enum.reduce(%{}, &Map.put(&2, &1.id, &1))以上です。このエントリでは、Elixirでマップのリストをマップに変換する方法を紹介しました。
 
  
 
コメントを送る
コメントはブログオーナーのみ閲覧できます