json - tutorial - Elixir: ¿Cómo convertir una lista de palabras clave en un mapa?
palabras clave seo (3)
Lo que tienes allí no es una lista de palabras clave, es solo una lista con cada elemento impar que representa una clave y cada elemento par que representa un valor.
La diferencia es:
[: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
Una lista de palabras clave se puede convertir en un mapa usando Enum.into/2
Enum.into([topic_id: "can''t be blank", created_by: "can''t be blank"], %{})
Ya que su estructura de datos es una lista, puede convertirla usando Enum.chunk/2 y Enum.reduce/3
[: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)
Puede leer más sobre las listas de palabras clave en http://elixir-lang.org/getting-started/maps-and-dicts.html
Tengo una lista de palabras clave de los errores del conjunto de cambios Ecto que me gustaría convertir a un mapa para que el analizador Poison JSON pueda generar correctamente una lista de errores de validación en el formato JSON.
Entonces obtengo una lista de errores de la siguiente manera:
[:topic_id, "can''t be blank", :created_by, "can''t be blank"]
... y me gustaría obtener un mapa de errores así:
%{topic_id: "can''t be blank", created_by: "can''t be blank"}
Alternativamente, si pudiera convertirlo en una lista de cadenas, podría usar eso también.
¿La mejor manera de realizar cualquiera de estas tareas?
Otra forma de hacerlo es combinando Enum.chunk/2
con Enum.into/3
. Por ejemplo:
[:topic_id, "can''t be blank", :created_by, "can''t be blank"]
|> Enum.chunk(2)
|> Enum.into(%{}, fn [key, val] -> {key, val} end)
Otra forma de hacerlo es usando la comprensión de la lista:
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"}
Además puedes convertir tu lista en lista de palabras clave:
iex> klist = for [key, val] <- Enum.chunk(list, 2), do: {key, val}
[topic_id: "can''t be blank", created_by: "can''t be blank"]
También podría ser útil en algunos casos.
Puede leer más sobre este caso de uso en http://elixir-lang.org/getting-started/comprehensions.html#results-other-than-lists