In our previous post, we sorted JavaScript objects by a custom order using a rank map. Elixir can do the sameβjust as cleanly.
Letβs say you have a list of maps representing issues:
tickets = [
%{type: :medium, title: "Scrollbar jitter"},
%{type: :critical, title: "Data loss on save"},
%{type: :low, title: "Typo in footer"},
%{type: :high, title: "Broken login link"}
]
And you want them sorted as: :critical
β :high
β :medium
β :low
.
First, we define a rank map
severity_rank = %{
critical: 0,
high: 1,
medium: 2,
low: 3
}
This can then be used to sort using Enum.sort_by
:
Enum.sort_by(tickets, fn ticket ->
Map.get(severity_rank, ticket.type, :infinity)
end)
Unknown types (e.g., typos or missing values) will land at the end thanks to :infinity
.
If you'd rather fail fast on unknown types:
Enum.sort_by(tickets, fn ticket ->
Map.fetch!(severity_rank, ticket.type)
end)
If you use the same order across modules:
@severity_rank %{critical: 0, high: 1, medium: 2, low: 3}
Then:
Enum.sort_by(tickets, &Map.fetch!(@severity_rank, &1.type))
If this post was enjoyable or useful for you, please share it! If you have comments, questions, or feedback, you can email my personal email. To get new posts, subscribe use the RSS feed.