例如,我有一个结构
post = %Post{title: "Title", desc: nil}
我想要
%{title: "Title"}
我的解决方案就像
post
|> Map.delete(:__struct__) # change the struct to a Map
|> Enum.filter(fn {_, v} -> v end)
|> Enum.into(%{})
它有效,但有更好的吗?
更新:
我觉得很烦人从Struct转换为Map,然后是Enum,然后再转换Map。有简洁的方法吗?
答案 0 :(得分:23)
而不是做
post
|> Map.delete(:__struct__) # change the struct to a Map
|> Enum.filter(fn {_, v} -> v end)
|> Enum.into(%{})
你可以做到
post
|> Map.from_struct
|> Enum.filter(fn {_, v} -> v != nil end)
|> Enum.into(%{})
它比手动删除__struct__
密钥更清晰。
答案 1 :(得分:17)
你也可以通过理解来做到这一点:
for {k, v} <- Map.from_struct(post), v != nil, into: %{}, do: {k, v}
答案 2 :(得分:4)
也可以这样写:
post
|> Map.from_struct
|> Enum.reject(fn {_, v} -> is_nil(v) end)
|> Map.new
答案 3 :(得分:0)
另一个选择是:
post
|> Map.from_struct()
|> Enum.filter(fn {_key, value} -> !is_nil(value) end)
|> Map.new()
Map.new/1
完全可以将关键字列表转换为地图。