2015-03-30 8 views
9

Zum Beispiel, ich habe eine StrukturWas ist eine gute Lösung, um Nil-Wert in einer Struktur für Elixir fallen zu lassen?

post = %Post{title: "Title", desc: nil} 

Und ich will, ist

%{title: "Title"} 

Meine Lösung erhalten, wie

post 
    |> Map.delete(:__struct__) # change the struct to a Map 
    |> Enum.filter(fn {_, v} -> v end) 
    |> Enum.into(%{}) 

Es funktioniert, aber ist es eine bessere?

aktualisieren:

Ich fühle es ärgerlich transformierende von Struct auf der Karte, dann Enum, dann wieder auf Karte. Gibt es einen prägnanten Weg?

+1

nicht ganz klar, was Sie fragen - besser, wie? Eine Sache, die ich ändern würde, ist 'Map.from_struct' anstelle von' Map.delete (...) ' –

+0

Danke, ich fühle mich nervig von Struct in Map umwandeln, dann Enum, dann Map. Gibt es einen prägnanten Weg? –

+1

@Tony Ihre Lösung ist in Ordnung Ich denke, aber es hat einen Fehler: Es wird auch Einträge mit dem Wert "false" verwerfen. Sie müssen die Filterung in 'Enum.filter (fn {_, v} -> v! = Nil end)' oder 'Enum.reject (fn {_, v} -> v == nil end) ändern' –

Antwort

16

Statt

post 
    |> Map.delete(:__struct__) # change the struct to a Map 
    |> Enum.filter(fn {_, v} -> v end) 
    |> Enum.into(%{}) 

tun können Sie tun

post 
    |> Map.from_struct 
    |> Enum.filter(fn {_, v} -> v != nil end) 
    |> Enum.into(%{}) 

Es ist nur etwas sauberer als manuell den __struct__ Schlüssel zu löschen.

+2

Sie sollten die Filterung im zweiten Beispiel entweder zu 'v! = Nil' ändern oder' reject' anstelle von 'filter' verwenden. –

+0

Schöner Fang. Logikfehler – hahuang65

+0

Btw, StackOverflow verwendet vier Leerzeichen Einrückung, um Code-Blöcke zu formatieren, Backticks sind nur für Inline-Code. Bearbeitete deine Antwort. –

9

Sie könnten auch tun dies mit Comprehensions:

for {k, v} <- Map.from_struct(post), v != nil, into: %{}, do: {k, v} 
+1

Danke für Ihre Antwort, die inspiriert ist! –

1

kann auch wie folgt geschrieben werden:

post 
    |> Map.from_struct 
    |> Enum.reject(fn {_, v} -> is_nil(v) end) 
    |> Map.new 
Verwandte Themen