2016-04-09 13 views
14

Ich versuche, eine Struktur auf eine Karte konvertieren zu können, reinigen alle Null-WerteElixir convert Struktur abzubilden

ich zur Zeit mit diesem Code

case Nadia.get_updates do 
    {:ok, results} -> 
     Map.from_struct(results) 
     |> Enum.filter(fn {_, v} -> v != nil end) 
     |> Enum.into(%{}) 

Hinweis: Nadia. get_updates gibt die folgende Struktur: https://hexdocs.pm/nadia/Nadia.Model.Update.html#t:t/0

Doch bin ich immer folgenden Fehler Empfang: keine Anpassungsfunktion Klausel in Map.from_struct/1

+5

Vielleicht ist 'Ergebnisse' eine Liste dieser Strukturen? Nicht nur eine Struktur? – JustMichael

Antwort

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

Wenn erfolgreich, wird eine Liste von Nadia.Model.Update.t zurückgegeben. Deshalb bekommst du diesen Fehler.

1

FWIW, ich habe eine Bibliothek geschrieben, die das automatisch für Sie erledigt, ohne die Datenstruktur auseinander ziehen zu müssen.

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

Dies ist aus dem Testcode:

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 

Hinweis, wenn Daten eine Liste der Karten sind, würde diese Arbeit gerade noch in Ordnung. Die PhStTransform-Bibliothek wird die Daten einfach auseinander ziehen, bis sie eine Karte findet. In Ihrem Fall würden Sie eine replace_nil Funktion verwenden, die auf die Art der Strukturen gearbeitet Sie interessiert sind.

6

Es gibt einen anderen Trick

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

Seit v0.15 wir Map.from_struct/1 haben, was tut genau dies.

defmodule User do 
    defstruct [:name] 
end 

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