Elixir không đã xây dựng trong mô hình phù hợp cho cố gắng để lọc ra các mục nhất định của một danh sách dựa trên giá trị của họ.
Bạn có thể viết một mô hình phù hợp để kiểm tra từng mục như sau:
match_country_code = fn (%{:code => "DE"} = country) -> country
(_) -> nil
end
Và sau đó vượt qua đó để Enum.find:
lands = [
%{name: "Deutschland", code: "DE"},
%{name: "Frankreich", code: "FR"}
]
Enum.find(lands, &(match_country_code.(&1)))
# => %{code: "DE", name: "Deutschland"}
Hoặc để khái quát bạn có thể:
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"}
Thay đổi tìm kiếm thành bộ lọc và nhận danh sách kết quả:
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"}]
Đây là một câu trả lời tuyệt vời, thậm chí không biết biểu mẫu thứ hai là có thể! – greggreg
Câu trả lời hay, một phần bổ sung nhỏ sẽ loại bỏ cảnh báo. Biến 't' trong mệnh đề hàm thứ hai không được sử dụng và do đó nên được chỉ định là' _t'. – b73
@ b73 nắm bắt tốt! Tôi đã viết rằng trên điện thoại di động vì vậy tôi thậm chí không chạy nó, oops :) Cảm ơn! – whatyouhide