Filtering maps
Example Data
fields = [%{field: "accessionnumber"}]
studies = [
%{patientname: "Carmack^John", patientid: 1, accessionnumber: "A001"},
%{patientname: "Kernighan^Brian", patientid: 2, accessionnumber: "A002"},
%{patientname: "Torvalds^Linus", patientid: 3, accessionnumber: "A003"},
%{patientname: "Van Rossum^Guido", patientid: 4, accessionnumber: "A004"},
%{patientname: "Valim^José", patientid: 5, accessionnumber: "A005"}
]
[
%{patientname: "Carmack^John", patientid: 1, accessionnumber: "A001"},
%{patientname: "Kernighan^Brian", patientid: 2, accessionnumber: "A002"},
%{patientname: "Torvalds^Linus", patientid: 3, accessionnumber: "A003"},
%{patientname: "Van Rossum^Guido", patientid: 4, accessionnumber: "A004"},
%{patientname: "Valim^José", patientid: 5, accessionnumber: "A005"}
]
Instead of elimating the fields we don’t want, just use fields to get the fields we do want. Since the map keys are atoms, we need to convert the fields to atoms as well. We also assume the shape of the fields is a list of maps where each map has one key, field.
field_names =
fields
|> Enum.map(&Map.get(&1, :field))
|> Enum.map(&String.to_atom(&1))
[:accessionnumber]
Now we enumerate the list of patients and extract the required fields.
Enum.map(studies, &Map.take(&1, field_names))
[
%{accessionnumber: "A001"},
%{accessionnumber: "A002"},
%{accessionnumber: "A003"},
%{accessionnumber: "A004"},
%{accessionnumber: "A005"}
]