[英]Recursively convert Map to Keyword List
我在互联网上找到了一个将地图转换成关键字列表的函数,但是它不是递归的:
def to_keyword_list(dict) do
Enum.map(dict, fn({key, value}) -> {String.to_atom(key), value} end)
end
然后我做了这个,但是给我一个错误。
def tokey(dict) do
Enum.map(dict, fn({key, value}) ->
if is_map value do
{String.to_atom(key), tokey(value)}
else
{String.to_atom(key), value}
end
end)
end
第一个结果:
["calig├╝eva": %{speeking: "speeeeeeee"}, test: "teet", tututu: "tururuuu"]
第二个结果:
** (ArgumentError) argument error
:erlang.binary_to_atom(:speeking, :utf8)
code.exs:10: anonymous fn/1 in Util.tokey/1
(elixir) lib/enum.ex:1233: anonymous fn/3 in Enum.map/2
(stdlib) lists.erl:1263: :lists.foldl/3
(elixir) lib/enum.ex:1772: Enum.map/2
code.exs:8: anonymous fn/1 in Util.tokey/1
(elixir) lib/enum.ex:1233: anonymous fn/3 in Enum.map/2
(stdlib) lists.erl:1263: :lists.foldl/3
有更简单或更有效的方法吗? 为什么会显示该错误? 我不能从内部调用函数吗?
第一个为u
更改ü
结果:
[caligueva: %{speeking: "speeeeeeee"}, test: "teet", tututu: "tururuuu"]
第二个输出相同的错误。 这是我正在使用的地图:
map = %{
"test" => "teet",
"tututu" => "tururuuu",
"caligueva" => %{"speeking": "speeeeeeee"}
}
要将Maps
递归转换为Elixir中的Keyword Lists
:
defmodule MyMap do
def to_keyword_list(map) do
Enum.map(map, fn {k,v} ->
v = cond do
is_map(v) -> to_keyword_list(v)
true -> v
end
{String.to_atom("#{k}"), v}
end)
end
end
但是正如@Dogbert已经提到的那样, “纯”原子不能包含大于255的代码点 ,因此您的映射键应该是简单的Strings / Atoms:
iex(1)> MyMap.to_keyword_list(%{"caligueva" => %{speeking: "speeeeeeee"}, "test" => "teet", "tututu" => "tururuuu"})
[caligueva: [speeking: "speeeeeeee"], test: "teet", tututu: "tururuuu"]
这是转换后的重构代码:
def map_to_keyword_list(map), do: convert(map)
defp convert(map) when is_map(map), do: Enum.map(map, fn {k,v} ->{String.to_atom(k),convert(v)} end)
defp convert(v), do: v
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.