Dictionary Elixir将结构转换为映射

Dictionary Elixir将结构转换为映射,dictionary,struct,elixir,telegram-bot,Dictionary,Struct,Elixir,Telegram Bot,我正在尝试将结构转换为映射,以便能够清除所有的nil值 我目前正在使用此代码 case Nadia.get_updates do {:ok, results} -> Map.from_struct(results) |> Enum.filter(fn {_, v} -> v != nil end) |> Enum.into(%{}) 注意:Nadia.get_updates返回以下结构: 但是我总是收到以下错误:Map

我正在尝试将结构转换为映射,以便能够清除所有的nil值

我目前正在使用此代码

  case Nadia.get_updates  do
    {:ok, results} ->
      Map.from_struct(results)
      |> Enum.filter(fn {_, v} -> v != nil end)
      |> Enum.into(%{})
注意:Nadia.get_updates返回以下结构:

但是我总是收到以下错误:Map.from_struct/1中没有匹配的function子句

get_updates([{atom, any}]) ::
  {:ok, [Nadia.Model.Update.t]} |
  {:error, Nadia.Model.Error.t}

如果成功,它将返回Nadia.Model.Update.t的列表。这就是为什么会出现这种错误。

FWIW,我写了一个库,它可以自动为您完成这类工作,而不必将数据结构分离

这来自测试代码:

test "implement scrub of empty values from map" do
  data = %{ :a => nil, :b => "", :c => "a"}
  replace_empty = fn(string, _d) -> if( string == "", do: nil , else: string) end
  replace_nil = fn(map, _depth) ->  for {k, v} <- map, v != nil , into: %{}, do: {k, v} end
  potion = %{ BitString => replace_empty, Map => replace_nil}

  assert PhStTransform.transform(data, potion) == %{:c => "a"}

end
test“从映射中执行空值清除”do
数据=%{a=>nil,:b=>“”,:c=>“a”}
替换_empty=fn(string,_d)->if(string==“”,do:nil,else:string)结束
replace_nil=fn(map,_depth)->对于{k,v}replace_empty,map=>replace_nil}
断言PhStTransform.transform(数据,药剂)=%{:c=>“a”}
结束
注意,如果数据是一个地图列表,这仍然可以正常工作。PhStTransform库将继续分离数据,直到找到映射。在您的例子中,您将使用replace_nil函数,该函数可以处理您感兴趣的各种结构

还有一个窍门

my_struct = %MyStruct{}
my_map = Map.delete my_struct, :__struct__
因为我们有
Map.from_struct/1
,它正是这样做的

defmodule User do
  defstruct [:name]
end

Map.from_struct(%User{name: "valim"})
#=> %{name: "valim"}

也许
results
是这些结构的列表?不止一个结构?哈哈!从我以前来过这里的投票来看。。。也许我应该纹身:)
mymap=Map.delete(mystruct,:\uu meta\uuuuuuuuu)|>Map.delete(:\uuuu struct\uuuuuuuuu)
@nelsonic-我实际上喜欢Juliano建议的Map方法。from_struct(%User{name:“valim”})是更好的方法是的,
Map.from_struct/1
绝对适合常规结构。但是当结构是一个外部变更集时,
Map.from_-struct/1
将无法完全工作,因此我们需要:
mymap=Map.from_-struct(变更集)>Map.delete(:\u-meta\uuu)