Elixir nie mają wbudowane wzór pasujący do starają się odfiltrować pewne elementy listy w oparciu o ich wartości.
można napisać mecz wzór sprawdzić poszczególne elementy tak:
match_country_code = fn (%{:code => "DE"} = country) -> country
(_) -> nil
end
a następnie przekazać, że do Enum.find:
lands = [
%{name: "Deutschland", code: "DE"},
%{name: "Frankreich", code: "FR"}
]
Enum.find(lands, &(match_country_code.(&1)))
# => %{code: "DE", name: "Deutschland"}
Albo uogólniać możesz:
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"}
Zmiana znalezionego filtra i wyświetlenie listy wyników:
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"}]
To jest świetna odpowiedź, nie wiedziałem nawet, że druga forma była możliwa! – greggreg
Świetna odpowiedź, jeden mały dodatek, który pozbędzie się ostrzeżenia. Zmienna 't' w drugiej klauzuli function nie jest używana i dlatego powinna być określona jako' _t'. – b73
@ b73 dobry połów! Napisałem to na telefon komórkowy, więc nawet go nie uruchomiłem, oops :) Dzięki! – whatyouhide