2017-02-03 1 views
0

Ich erstelle einen einfachen Dienst, der eine E-Mail-Adresse - und findet den Benutzer - aus einer Liste von Benutzern.Get map nach Wert aus Liste in Elixir

Hier ist eine vereinfachte Version mit einer Liste von Benutzern. Ich möchte einen Benutzer anhand seiner E-Mail-Adresse extrahieren.

def endpoint do 
    [%{email: "[email protected]", account_type: "full"}, 
    %{email: "[email protected]", account_type: "standard"}, 
    %{email: "[email protected]", account_type: "full"}] 
end 

def get_by_email(user, email) do 
    user |> Map.get(:email) 
end 

def dev_endpoint(email) do 
    endpoint 
    |> Enum.map(&get_by_email(email)/1) 
end 

def show(conn, %{"id" => email}) do 
    response = dev_endpoint(email) 
    json(conn, %{"email" => response}) 
end 

So im Wesentlichen:

dev_endpoint("[email protected]") 

Sollte zurück:

%{email: "[email protected]", account_type: "full"} 

Ich weiß, es ist etwas falsch mit meiner Capture-Syntax, aber ich habe verschiedene Iterationen versucht, mit kein Glück.

+1

Vielleicht kann ich nicht ganz verstehen, was Sie wollen, ist aber nicht 'Endpunkt |> Enum.find (& (email == Map.get (& 1,: email))) 'ausreichend? – ymonad

Antwort

3

Ich denke, Sie suchen nach Enum.find/2. Dies ist, wie ich es benutzen würde:

def endpoint do 
    [%{email: "[email protected]", account_type: "full"}, 
    %{email: "[email protected]", account_type: "standard"}, 
    %{email: "[email protected]", account_type: "full"}] 
end 

def find_by_email(email) do 
    Enum.find(endpoint, fn u -> u.email == email end) 
end 

Jetzt können Sie nur verwenden, um dies:

iex> MyModule.find_by_email("[email protected]") 
%{email: "[email protected]", account_type: "full"}