web-dev-qa-db-fra.com

Elixir: Comment convertir une liste de mots clés en carte?

J'ai une liste de mots clés d'erreurs d'ensemble de modifications Ecto que je voudrais convertir en une carte afin que l'analyseur Poison JSON puisse correctement afficher une liste d'erreurs de validation au format JSON.

Je reçois donc une liste d'erreurs comme suit:

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

... et j'aimerais obtenir une carte des erreurs comme ceci:

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

Alternativement, si je pouvais le convertir en une liste de chaînes, je pourrais également l'utiliser.

La meilleure façon d'accomplir l'une ou l'autre de ces tâches?

31
Eric Budd

Ce que vous avez là-bas n'est pas une liste de mots clés, c'est juste une liste avec chaque élément impair représentant une clé et chaque élément pair représentant une valeur.

La différence est:

[: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

Une liste de mots clés peut être transformée en carte en utilisant Enum.into/2

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

Puisque votre structure de données est une liste, vous pouvez la convertir en utilisant Enum.chunk/2 et 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)

Vous pouvez en savoir plus sur les listes de mots clés sur http://elixir-lang.org/getting-started/maps-and-dicts.html

49
Gazler

Pour ce faire, vous pouvez également combiner Enum.chunk/2 avec Enum.into/3. Par exemple:

[: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

Encore une autre façon de le faire est d'utiliser la compréhension de liste:

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"}

De plus, vous pouvez convertir votre liste en liste de mots clés:

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

Il pourrait également être utile dans certains cas.

Vous pouvez en savoir plus sur ce cas d'utilisation sur http://elixir-lang.org/getting-started/comprehensions.html#results-other-than-lists

6
Roman Smirnov