2016-04-21 9 views
3

Ich habe eine Liste der erforderlichen Schlüssel (required_keys):Die richtige Art und Weise zu bestimmen, ob eine Karte bestimmte Tasten hat

["artist", "track", "year"] 

und eine Karte (params):

%{"track" => "bogus", "artist" => "someone"} 

und ich möchte, um zu bestimmen wenn die params die required_keys hat. Ich komme aus einem Ruby-Hintergrund und die Iteration scheint für Elixir falsch zu sein, aber ich bin mir nicht sicher, wie ich dies tun soll.

Antwort

5

Verwenden Enum.all?/2 und Map.has_key?/2:

iex(1)> map = %{"track" => "bogus", "artist" => "someone"} 
%{"artist" => "someone", "track" => "bogus"} 
iex(2)> map2 = %{"track" => "bogus", "artist" => "someone", "year" => 2016} 
%{"artist" => "someone", "track" => "bogus", "year" => 2016} 
iex(3)> required_keys = ["artist", "track", "year"] 
["artist", "track", "year"] 
iex(4)> Enum.all?(required_keys, &Map.has_key?(map, &1)) 
false 
iex(5)> Enum.all?(required_keys, &Map.has_key?(map2, &1)) 
true 

aber nicht sicher, wie man Muster-Match dieses

Pattern Matching nicht möglich ist, wenn required_keys dynamisch ist. Wenn es sich um eine statische Liste ist, können Sie Pattern-Matching verwenden:

iex(6)> match?(%{"artist" => _, "track" => _, "year" => _}, map) 
false 
iex(7)> match?(%{"artist" => _, "track" => _, "year" => _}, map2) 
true 
+0

Sie @Dogbert rock! Danke noch einmal. – Midwire

+0

Für das obige statische Listenbeispiel. Müssen die Schlüssel in der gleichen Reihenfolge sein, damit sie übereinstimmen? – Midwire

+0

Nein, sie können in beliebiger Reihenfolge sein. Außerdem kann Ihre tatsächliche Karte mehr Schlüssel als diese 3 haben und sie werden ignoriert. – Dogbert

1
requireds = ["artist", "track", "year"] 
params = %{"track" => "bogus", "artist" => "someone"} 
Enum.all?(requireds, fn(k) -> Map.has_key?(params, k) end) # => false 
requireds = ["artist", "track"] 
Enum.all?(requireds, fn(k) -> Map.has_key?(params, k) end) # => true 

oder mit Mustervergleich:

def has_required_params?(%{"artist" => _, "track" => _, "year" => _}), do: true 
def has_required_params?(_), do: false 

has_required_params?(%{"track" => "bogus", "artist" => "someone"}) # => false 
has_required_params?(%{"track" => "bogus", "artist" => "someone", year => "2000"}) # => true 
Verwandte Themen