Convert list of struct to map

Hi, I am facing problem to convert a list of struct to maps. Please suggest an optimized way. My data is:

[%Apollo.Accounts.Schema.ImportedEmailStatu{
    id: 14,
    imported_email_id: 37,
    inserted_at: ~N[2019-06-06 07:17:11],
    job_id: 1,
    status: "matched",
    updated_at: ~N[2019-06-06 07:17:11]
  },
    %Apollo.Accounts.Schema.ImportedEmailStatu{
    id: 15,
    imported_email_id: 37,
    inserted_at: ~N[2019-06-06 07:17:11],
    job_id: 1,
    status: "matched",
    updated_at: ~N[2019-06-06 07:17:11]
  },
  %Apollo.Accounts.Schema.ImportedEmailStatu{
    id: 16,
    imported_email_id: 37,
    inserted_at: ~N[2019-06-06 07:17:11],
    job_id: 1,
    status: "unmatched",
    updated_at: ~N[2019-06-06 07:17:11]
  }]```
Result i want
```%{
    "matched" => [%{"id" => 14},%{"id" => 15}],
    "unmatched" => [%{"id" => 16}]
}```
data
|> Enum.group_by(& &1.status)
|> Map.new(fn {status, list} -> 
  {status, Enum.map(list, &(%{"id" => &1.id}))}
end)
3 Likes
iex(2)> group_id_by_status = fn value, acc ->
...(2)>   id_value = %{id: value.id}
...(2)>   Map.update(acc, value.status, [id_value], &[id_value|&1])
...(2)> end
#Function<12.128620087/2 in :erl_eval.expr/5>
iex(3)> List.foldl(data, %{}, group_id_by_status)
%{"matched" => [%{id: 15}, %{id: 14}], "unmatched" => [%{id: 16}]}
iex(4)>

Just

data |> Enum.group_by(& &1.status, & %{"id" => &1.id})
1 Like