web-dev-qa-db-ja.com

Elixir:キーワードリストをマップに変換する方法は?

Poison JSONパーサーが検証エラーのリストをJSON形式で正しく出力できるように、マップに変換したいEcto変更セットエラーのキーワードリストがあります。

だから私は次のようにエラーのリストを取得します:

[:topic_id, "can't be blank", :created_by, "can't be blank"]

...そして、私はそのようなエラーのマップを取得したい:

%{topic_id: "can't be blank", created_by: "can't be blank"}

あるいは、文字列のリストに変換できれば、それも使用できます。

これらのタスクのいずれかを達成する最良の方法は?

31
Eric Budd

持っているものはキーワードリストではなく、すべての奇数要素がキーを表し、すべての偶数要素が値を表す単なるリストです。

違いは:

[:topic_id, "can't be blank", :created_by, "can't be blank"] # List
[topic_id: "can't be blank", created_by: "can't be blank"]   # Keyword List

キーワードリストは Enum.into/2 を使用してマップに変換できます。

Enum.into([topic_id: "can't be blank", created_by: "can't be blank"], %{})

データ構造はリストなので、 Enum.chunk/2 および Enum.reduce/ を使用して変換できます

[:topic_id, "can't be blank", :created_by, "can't be blank"]
|> Enum.chunk(2)
|> Enum.reduce(%{}, fn ([key, val], acc) -> Map.put(acc, key, val) end)

キーワードリストの詳細については、 http://elixir-lang.org/getting-started/maps-and-dicts.html をご覧ください。

49
Gazler

これを行う別の方法は、Enum.chunk/2 with Enum.into/3。例えば:

[:topic_id, "can't be blank", :created_by, "can't be blank"]
|> Enum.chunk(2)
|> Enum.into(%{}, fn [key, val] -> {key, val} end)
10
Gjaldon

さらに別の方法は、リストの内包表記を使用することです。

iex> list = [:topic_id, "can't be blank", :created_by, "can't be blank"]
iex> map = for [key, val] <- Enum.chunk(list, 2), into: %{}, do: {key, val}
%{created_by: "can't be blank", topic_id: "can't be blank"}

さらに、リストをキーワードリストに変換できます。

iex> klist = for [key, val] <- Enum.chunk(list, 2), do: {key, val}
[topic_id: "can't be blank", created_by: "can't be blank"]

場合によっては役に立つこともあります。

この使用例の詳細については、 http://elixir-lang.org/getting-started/comprehensions.html#results-other-than-lists をご覧ください。

6
Roman Smirnov