プログラミングにおいて、連想配列のリストをなんらかのプロパティをキーにした連想配列に変換したいということはよくあります。
ちょうど下記のようなイメージです。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でマップのリストをマップに変換する方法を紹介しました。
コメントを送る
コメントはブログオーナーのみ閲覧できます