【问题标题】:Elixir convert struct to mapElixir 将结构转换为映射
【发布时间】:2016-07-30 11:40:06
【问题描述】:

我正在尝试将 struct 转换为 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 返回以下结构: https://hexdocs.pm/nadia/Nadia.Model.Update.html#t:t/0

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

【问题讨论】:

  • 也许results 是这些结构的列表?不只是一个结构?

标签: dictionary struct elixir telegram-bot


【解决方案1】:
get_updates([{atom, any}]) ::
  {:ok, [Nadia.Model.Update.t]} |
  {:error, Nadia.Model.Error.t}

如果成功,它会返回一个 Nadia.Model.Update.t 列表。这就是您收到该错误的原因。

【讨论】:

    【解决方案2】:

    FWIW,我写了一个库,它会自动为你做这种事情,而不必将数据结构分开。

    https://github.com/philosophers-stone/transform

    这是来自测试代码:

    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
    

    注意,如果数据是地图列表,这仍然可以正常工作。 PhStTransform 库将一直拉开数据,直到找到地图。在您的情况下,您将使用可处理您感兴趣的结构类型的 replace_nil 函数。

    【讨论】:

      【解决方案3】:

      还有一个技巧

      my_struct = %MyStruct{}
      my_map = Map.delete my_struct, :__struct__
      

      【讨论】:

      • mymap = Map.delete(mystruct, :__meta__) |&gt; Map.delete(:__struct__)
      • @nelsonic - 我实际上喜欢 Juliano 建议的方法 Map.from_struct(%User{name: "valim"}) 是更好的方法
      • 是的,Map.from_struct/1 绝对适合常规结构。但是当结构是 Ecto 变更集时,Map.from_struct/1 将无法完全工作,所以我们需要:mymap = Map.from_struct(changeset) |&gt; Map.delete(:__meta__)
      【解决方案4】:

      因为v0.15 我们有Map.from_struct/1 正是这样做的。

      defmodule User do
        defstruct [:name]
      end
      
      Map.from_struct(%User{name: "valim"})
      #=> %{name: "valim"}
      

      【讨论】:

      • 哈哈!从我以前来过这里的投票来看……也许我应该纹身:)
      猜你喜欢
      • 1970-01-01
      • 2012-06-11
      • 1970-01-01
      • 2022-01-19
      • 1970-01-01
      • 2021-12-21
      • 1970-01-01
      • 1970-01-01
      • 2012-06-16
      相关资源
      最近更新 更多