Dictionary Elixir将结构转换为映射
我正在尝试将结构转换为映射,以便能够清除所有的nil值 我目前正在使用此代码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
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)