アルパカログ

Webエンジニア兼マネージャーがプログラミングやマネジメント、読んだ本のまとめを中心に書いてます。

Elixir リストをマップに変換する方法(List to Map)

f:id:otoyo0122:20201114105031p:plain:w300

プログラミングにおいて、連想配列のリストをなんらかのプロパティをキーにした連想配列に変換したいということはよくあります。

ちょうど下記のようなイメージです。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でマップのリストをマップに変換する方法を紹介しました。