2015-07-21 9 views
18

Ben bir haritaya dönüştürmek istediğiniz Ecto changeset hataların bir anahtar kelime listesi var ki Zehir JSON ayrıştırıcı can JSON biçiminde doğrulama hatalarının bir liste doğru çıktı. aşağıdaki gibiElixir: Anahtar kelime listesini bir haritaya nasıl dönüştürebilirim?

yüzden hataların bir listesini almak:

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

... ve şöyle hataların bir harita almak istiyorum:

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

Alternatif Elimde olsa onu bir dizeler listesine dönüştür, ben de kullanabilirim.

Aşağıdaki görevlerden biri başarmanın en iyi yolu? Eğer bir anahtar kelime listesi yoktur ne var

cevap

34

, bir anahtar ve bir değeri temsil her bile elemanı temsil eden her tek eleman ile sadece bir listedir.

farktır:

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

bir anahtar kelime listesi kullanarak bir harita dönüştürülebilir Enum.into/2

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

veri yapısı listesi olduğu için, Enum.chunk/2 ve Enum.reduce/3

kullanarak dönüştürebilirsiniz
[: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) 

yapabilirsiniz http://elixir-lang.org/getting-started/maps-and-dicts.html

+2

bu kullanım Dava hakkında daha fazla bilgi bulabilirsiniz Bunu hemen denemek olamaz, ama 'son örneği azaltmak mümkün olmalıdır bir his var [...] | > Enum.chunk (2) |> Enum.into (% {}) ' –

+0

Ah, bir liste ve bir anahtar kelime listesinde arasındaki farkı kaçırdı. Teşekkürler! –

+0

Ayrıca OP ile aynı sorunu yaşıyorum, sadece Changeset'in uygulamasını değiştirdiğine inanıyorum. Değişiklik hatalarını ATOW _is_ bir anahtar kelime listesi, ör. [alan_1: {"geçersiz", [tür: Ecto.UUID]}, alan_2: {"boş bırakılamaz", []}] '. Bu yanıtın 'Enum.into' yaklaşımını kullanarak error_map = Enum.into (changeset.errors,% {})' kullanarak bir haritaya dönüştürebiliyordum. Bir harita olarak, mesajımı '{err_msg, _type} = Map.fetch! (Error_map,: field_1)') ile alabilirim. – ibgib

7

adresindeki Anahtar Kelime Listeleri hakkında daha fazla bilgi edinin Enum.chunk/2'u Enum.into/3 ile birleştirerek yapabilirsiniz. Örneğin:

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

Oysa bunu yapmak için başka bir yol liste anlayışının kullanmaktır:

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

O olabilir: listeyi anahtar kelime listenizi dönüştürebilirsiniz yanında

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

Bazı durumlarda da yararlıdır.

Sen http://elixir-lang.org/getting-started/comprehensions.html#results-other-than-lists

İlgili konular