将列表中的字符串转换为原子

时间:2017-12-12 12:44:40

标签: elixir phoenix-framework

所以,我在地图中有一个字符串列表,如下所示:

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

我想将其转换为列表中的 atom ,如下所示:

[:status_id, :first_name].

使用类似的东西:

String.to_existing_atom 

但该函数需要一个参数,而不是列表。

我找不到在列表中执行此操作的方法。通过一些内置功能可以吗?

我该怎么办?

非常感谢任何帮助。

3 个答案:

答案 0 :(得分:3)

您可以使用Map.update!/3更新地图内的值,然后使用Enum.map/2将列表映射到String.to_existing_atom/1

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

答案 1 :(得分:1)

我会使用两个简单的函数来转换它。 首先让我们将地图放入变量中。

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

然后只是:

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

它返回:

[:status_id, :first_name]

答案 2 :(得分:1)

Kernel.update_in/3Enum.map/2来救援:

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