2017-12-12 7 views
0

So habe ich eine Liste von Zeichenketten in einer Karte, wie folgt aus:eine Zeichenfolge in einer Liste in einem Atom

%{select => ["status_id", "first_name"]}. 

ich es in ein Atom in einer Liste konvertieren möchten, wie diese :

[:status_id, :first_name]. 

mit so etwas wie:

String.to_existing_atom 

aber diese Funktion ein Argument, keine Liste.

Ich konnte keinen Weg finden, es in einer Liste zu tun. Ist es möglich, durch eine eingebaute Funktion?

Wie kann ich es tun?

Jede Hilfe wird sehr geschätzt.

Antwort

3

können Sie Map.update!/3 verwenden, um einen Wert in einer Karte zu aktualisieren und dann Enum.map/2 die Liste über String.to_existing_atom/1 zur Karte:

iex(1)> :status_id 
:status_id 
iex(2)> :first_name 
:first_name 
iex(3)> map = %{:select => ["status_id", "first_name"]} 
%{select: ["status_id", "first_name"]} 
iex(4)> map2 = Map.update!(map, :select, fn list -> Enum.map(list, &String.to_existing_atom/1) end) 
%{select: [:status_id, :first_name]} 
+0

Dank 'E num.map's.That was ich suche – script

1

ich zwei einfache Funktionen, die es zu transformieren, verwenden würde. Zuerst legen wir die Karte in eine Variable.

map = %{:select => ["status_id", "first_name"]} 

Und dann nur:

map 
|> Map.get(:select) 
|> Enum.map(fn(x) -> String.to_atom(x) end) 

Es gibt:

[:status_id, :first_name] 
1

Kernel.update_in/3 und Enum.map/2 zur Rettung kommen:

iex(1)> foo = %{select: ~w|status_id first_name|} 
#⇒ %{select: ["status_id", "first_name"]} 
iex(2)> update_in foo, ~w|select|a, fn e -> 
...(2)> Enum.map(e, &String.to_atom/1) 
...(2)> end 
#⇒ %{select: [:status_id, :first_name]} 
Verwandte Themen