您可以使用
Enum.group_by/3
:
Enum.group_by(dates, fn {date, _} -> Ecto.Date.cast!(date) end)
这将导致以下结果:
%{#Ecto.Date<2016-05-06> => [{"2016-05-06T09:30:20", "Ate breakfast"},
{"2016-05-06T08:59:50", "Woke up"}],
#Ecto.Date<2016-05-07> => [{"2016-05-07T01:48:10", "Went to bed"}]}
然而,映射不是有序数据类型,因此您可能应该在使用
Enum.sort/1
:
Enum.group_by(dates, fn {date, _} -> Ecto.Date.cast!(date) end) |> Enum.sort()
[{#Ecto.Date<2016-05-06>,
[{"2016-05-06T09:30:20", "Ate breakfast"},
{"2016-05-06T08:59:50", "Woke up"}]},
{#Ecto.Date<2016-05-07>, [{"2016-05-07T01:48:10", "Went to bed"}]}]
模板应类似于:
<%= for {date, events} <- @dates do %>
<h1><%= date %></h1>
<%= for event <- Enum.reverse(events) do %>
<%= event %>
<% end %>
<% end %>
请注意,我们将列表颠倒过来,这是因为
group_by
将通过在列表前面加上标题来构建列表。