繁体   English   中英

将地图递归转换为关键字列表

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM