Elixir does not have built-in template matching for filtering individual list items based on their values.
You can write pattern matching to validate individual elements, for example:
match_country_code = fn (%{:code => "DE"} = country) -> country (_) -> nil end
And then pass this to Enum.find:
lands = [ %{name: "Deutschland", code: "DE"}, %{name: "Frankreich", code: "FR"} ] Enum.find(lands, &(match_country_code.(&1))) # => %{code: "DE", name: "Deutschland"}
Or to summarize, you can:
lands = [ %{name: "Deutschland", code: "DE"}, %{name: "Frankreich", code: "FR"} ] find_by = fn (list, key, val) -> Enum.find(list, &(Map.get(&1, key)==val)) end find_by.(lands, :name, "DE") #=> %{code: "DE", name: "Deutschland"}
Modify your search for filtering and get a list of results:
lands = [ %{name: "Deutschland", code: "DE"}, %{name: "Germany", code: "DE"}, %{name: "Frankreich", code: "FR"} ] filter_by = fn (list, key, val) -> Enum.filter(list, &(Map.get(&1, key)==val)) end filter_by.(lands, :code, "DE") #=> [%{code: "DE", name: "Deutschland"}, %{code: "DE", name: "Germany"}]