Filter List of Map Using Enum. Reduce

I have a map as

%Subject
{
    sub_id: 1,
    content: %{
               sub_name: "oracle",
               type: "code",
    },
    publisher: "quantum",
    ouby_id: "afc5a6e23208",
    region: "USA",
  }

I have a list as follows

[
%user{id: 4, name: "kane", status: "A"},
%user{id: 3, name: "Harry", status: "P"},
%user{id: 5, name: "Tom", status: "A"}
]

I want to filter User with status: "A" and create a new map as

[
%{id: 4,name: "kane", sub_id: 1, sub_name: "oracle"},
%{id: 5,name: "Tom", sub_id: 1, sub_name: "oracle"}
]

Can anyone please help me with this?

Thank you.

6

2 Answers

Despite the solution by Adam is perfectly correct, I’d better go with .

[
  %{id: 4, name: "kane", status: "A"},
  %{id: 3, name: "Harry", status: "P"},
  %{id: 5, name: "Tom", status: "A"}
]
|> Enum.reduce([], fn
  %{status: "A"} = elem, acc ->
    elem =
      elem
      |> Map.take(~w|id name|a)
      |> Map.put(:sub_id, subject.sub_id),
      |> Map.put(:sub_name, subject.content.sub_name)
    [elem | acc]
  _, acc ->
    acc
end)
|> Enum.reverse()

I think using a combination of filter and map would be better here. You didn't explain why Subject was necessary, so I just hardcoded the values you said would always be the same.

[
  %User{id: 4, name: "kane", status: "A"},
  %User{id: 3, name: "Harry", status: "P"},
  %User{id: 5, name: "Tom", status: "A"}
]
|> Stream.filter(&(&1.status == "A"))
|> Enum.map(fn map ->
  %{
    id: map.id,
    name: map.name,
    sub_id: 1,
    sub_name: "oracle"
  }
end)

Result:

[
  %{id: 4, name: "kane", sub_id: 1, sub_name: "oracle"},
  %{id: 3, name: "Harry", sub_id: 1, sub_name: "oracle"},
  %{id: 5, name: "Tom", sub_id: 1, sub_name: "oracle"}
]
4

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge that you have read and understand our privacy policy and code of conduct.

Robert Thorne

Robert Thorne

Automotive & Future Transportation Editor

Robert Thorne covers electric vehicle innovations, autonomous driving systems, global mobility trends, and automotive engineering developments.

Share this article
Twitter Facebook Pinterest