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"}
あるいは、文字列のリストに変換できれば、それも使用できます。
これらのタスクのいずれかを達成する最良の方法は?
持っているものはキーワードリストではなく、すべての奇数要素がキーを表し、すべての偶数要素が値を表す単なるリストです。
違いは:
[: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 をご覧ください。
これを行う別の方法は、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)
さらに別の方法は、リストの内包表記を使用することです。
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 をご覧ください。