所以,我在地图中有一个字符串列表,如下所示:
%{select => ["status_id", "first_name"]}.
我想将其转换为列表中的 atom ,如下所示:
[:status_id, :first_name].
使用类似的东西:
String.to_existing_atom
但该函数需要一个参数,而不是列表。
我找不到在列表中执行此操作的方法。通过一些内置功能可以吗?
我该怎么办?
非常感谢任何帮助。
答案 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/3
和Enum.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]}