在Elixir的结构中删除nil值的好方法是什么?

时间:2015-03-30 16:35:42

标签: elixir

例如,我有一个结构

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。有简洁的方法吗?

4 个答案:

答案 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完全可以将关键字列表转换为地图。