Elixir in Muster haben keinen eingebauten passend für bestimmte Elemente einer Liste auf ihre Werte basierend auf herauszufiltern versuchen.
Sie könnten ein Muster Spiel schreiben einzelne Positionen zu überprüfen, wie so:
match_country_code = fn (%{:code => "DE"} = country) -> country
(_) -> nil
end
Und dann das passieren zu Enum.find:
lands = [
%{name: "Deutschland", code: "DE"},
%{name: "Frankreich", code: "FR"}
]
Enum.find(lands, &(match_country_code.(&1)))
# => %{code: "DE", name: "Deutschland"}
Oder verallgemeinern Sie könnten:
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"}
Ändern Sie die Suche zu filtern und erhalten Sie eine Liste der Ergebnisse:
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"}]
Dies ist eine gute Antwort, wusste nicht einmal die zweite Form war möglich! – greggreg
Große Antwort, eine kleine Ergänzung, die eine Warnung loswerden wird. Die 't'-Variable in der zweiten function-Klausel wird nicht verwendet und sollte daher als' _t' angegeben werden. – b73
@ b73 guten Fang! Ich schrieb das auf Handy, also habe ich es nicht einmal laufen lassen, oops :) Danke! – whatyouhide