2017-09-29 2 views
0

Ich habe eine Liste von Karten, die Datum enthalten. Ich weiß nicht, wie lange diese Liste ist (kann mehrere Jahre sein). Ich weiß nur, dass die Liste nach Datum sortiert ist und keine doppelten Daten enthält.Teilen Sie eine Liste von Tagen in eine Liste von Monaten, die eine Liste von Tagen enthalten

Beispiel:

[ 
%{date: ~D[2017-01-01], y: ["x"]}, %{date: ~D[2017-01-02], y: ["x"]}, 
%{date: ~D[2017-01-03], y: ["x"]}, %{date: ~D[2017-01-04], y: ["x"]}, 
%{date: ~D[2017-01-05], y: ["x"]}, %{date: ~D[2017-01-06], y: ["x"]}, 
%{date: ~D[2017-01-07], y: ["x"]}, %{date: ~D[2017-01-08], y: ["x"]}, 
%{date: ~D[2017-01-09], y: ["x"]}, %{date: ~D[2017-01-10], y: ["x"]}, 
%{date: ~D[2017-01-11], y: ["x"]}, %{date: ~D[2017-01-12], y: ["x"]}, 
%{date: ~D[2017-01-13], y: ["x"]}, %{date: ~D[2017-01-14], y: ["x"]}, 
%{date: ~D[2017-01-15], y: ["x"]}, %{date: ~D[2017-01-16], y: ["x"]}, 
%{date: ~D[2017-01-17], y: ["x"]}, %{date: ~D[2017-01-18], y: ["x"]}, 
%{date: ~D[2017-01-19], y: ["x"]}, %{date: ~D[2017-01-20], y: ["x"]}, 
%{date: ~D[2017-01-21], y: ["x"]}, %{date: ~D[2017-01-22], y: ["x"]}, 
%{date: ~D[2017-01-23], y: ["x"]}, %{date: ~D[2017-01-24], y: ["x"]}, 
%{date: ~D[2017-01-25], y: ["x"]}, %{date: ~D[2017-01-26], y: ["x"]}, 
%{date: ~D[2017-01-27], y: ["x"]}, %{date: ~D[2017-01-28], y: ["x"]}, 
%{date: ~D[2017-01-29], y: ["x"]}, %{date: ~D[2017-01-30], y: ["x"]}, 
%{date: ~D[2017-01-31], y: ["x"]}, %{date: ~D[2017-02-01], y: ["x"]}, 
%{date: ~D[2017-02-02], y: ["x"]}, %{date: ~D[2017-02-03], y: ["x"]} 
] 

Ich mag eine Liste der Monate, die die Tage enthalten:

[ 
[ 
%{date: ~D[2017-01-01], y: ["x"]}, %{date: ~D[2017-01-02], y: ["x"]}, 
%{date: ~D[2017-01-03], y: ["x"]}, %{date: ~D[2017-01-04], y: ["x"]}, 
%{date: ~D[2017-01-05], y: ["x"]}, %{date: ~D[2017-01-06], y: ["x"]}, 
%{date: ~D[2017-01-07], y: ["x"]}, %{date: ~D[2017-01-08], y: ["x"]}, 
%{date: ~D[2017-01-09], y: ["x"]}, %{date: ~D[2017-01-10], y: ["x"]}, 
%{date: ~D[2017-01-11], y: ["x"]}, %{date: ~D[2017-01-12], y: ["x"]}, 
%{date: ~D[2017-01-13], y: ["x"]}, %{date: ~D[2017-01-14], y: ["x"]}, 
%{date: ~D[2017-01-15], y: ["x"]}, %{date: ~D[2017-01-16], y: ["x"]}, 
%{date: ~D[2017-01-17], y: ["x"]}, %{date: ~D[2017-01-18], y: ["x"]}, 
%{date: ~D[2017-01-19], y: ["x"]}, %{date: ~D[2017-01-20], y: ["x"]}, 
%{date: ~D[2017-01-21], y: ["x"]}, %{date: ~D[2017-01-22], y: ["x"]}, 
%{date: ~D[2017-01-23], y: ["x"]}, %{date: ~D[2017-01-24], y: ["x"]}, 
%{date: ~D[2017-01-25], y: ["x"]}, %{date: ~D[2017-01-26], y: ["x"]}, 
%{date: ~D[2017-01-27], y: ["x"]}, %{date: ~D[2017-01-28], y: ["x"]}, 
%{date: ~D[2017-01-29], y: ["x"]}, %{date: ~D[2017-01-30], y: ["x"]}, 
%{date: ~D[2017-01-31], y: ["x"]} 
], 
[ 
%{date: ~D[2017-02-01], y: ["x"]}, 
%{date: ~D[2017-02-02], y: ["x"]}, %{date: ~D[2017-02-03], y: ["x"]} 
] 
] 

Da jeden Monat eine andere Länge hat (plus das Schaltjahr-Problem) Ich habe keine Ahnung, wie um die Liste zu teilen. Kann das gemacht werden?

+1

FWIW, 'Enum.group_by/3 'Sie wurden 3 Stunden zuvor in der Antwort auf Ihre vorherige Frage vorgestellt, macht leicht den gleichen Trick (während' Enum.chunk_by/2' hier definitiv eine bessere Wahl ist): 'list |> Enum.group_by (fn% {date: % {Jahr: Jahr, Monat: Monat}} -> {Jahr, Monat} Ende) |> Map.values'. – mudasobwa

Antwort

2

Ich würde Enum.chunk_by/2 verwenden, ein Tupel des Jahres und den Monat des Datums jedes Elements in der Callback-Funktion zurückgeben. Dadurch wird die Liste jedes Mal geteilt, wenn sich das Jahr oder der Monat ändert. (Just month wird nicht korrekt funktionieren, wenn Ihre Liste enthält zB 2016.01.01 von 2017.01.01 gefolgt.)

list = [ 
    %{date: ~D[2017-01-01], y: ["x"]}, %{date: ~D[2017-01-02], y: ["x"]}, 
    %{date: ~D[2017-01-03], y: ["x"]}, %{date: ~D[2017-01-04], y: ["x"]}, 
    %{date: ~D[2017-01-05], y: ["x"]}, %{date: ~D[2017-01-06], y: ["x"]}, 
    %{date: ~D[2017-01-07], y: ["x"]}, %{date: ~D[2017-01-08], y: ["x"]}, 
    %{date: ~D[2017-01-09], y: ["x"]}, %{date: ~D[2017-01-10], y: ["x"]}, 
    %{date: ~D[2017-01-11], y: ["x"]}, %{date: ~D[2017-01-12], y: ["x"]}, 
    %{date: ~D[2017-01-13], y: ["x"]}, %{date: ~D[2017-01-14], y: ["x"]}, 
    %{date: ~D[2017-01-15], y: ["x"]}, %{date: ~D[2017-01-16], y: ["x"]}, 
    %{date: ~D[2017-01-17], y: ["x"]}, %{date: ~D[2017-01-18], y: ["x"]}, 
    %{date: ~D[2017-01-19], y: ["x"]}, %{date: ~D[2017-01-20], y: ["x"]}, 
    %{date: ~D[2017-01-21], y: ["x"]}, %{date: ~D[2017-01-22], y: ["x"]}, 
    %{date: ~D[2017-01-23], y: ["x"]}, %{date: ~D[2017-01-24], y: ["x"]}, 
    %{date: ~D[2017-01-25], y: ["x"]}, %{date: ~D[2017-01-26], y: ["x"]}, 
    %{date: ~D[2017-01-27], y: ["x"]}, %{date: ~D[2017-01-28], y: ["x"]}, 
    %{date: ~D[2017-01-29], y: ["x"]}, %{date: ~D[2017-01-30], y: ["x"]}, 
    %{date: ~D[2017-01-31], y: ["x"]}, %{date: ~D[2017-02-01], y: ["x"]}, 
    %{date: ~D[2017-02-02], y: ["x"]}, %{date: ~D[2017-02-03], y: ["x"]} 
] 

list 
|> Enum.chunk_by(fn %{date: %{year: year, month: month}} -> {year, month} end) 
|> IO.inspect 

Ausgang:

[[%{date: ~D[2017-01-01], y: ["x"]}, %{date: ~D[2017-01-02], y: ["x"]}, 
    %{date: ~D[2017-01-03], y: ["x"]}, %{date: ~D[2017-01-04], y: ["x"]}, 
    %{date: ~D[2017-01-05], y: ["x"]}, %{date: ~D[2017-01-06], y: ["x"]}, 
    %{date: ~D[2017-01-07], y: ["x"]}, %{date: ~D[2017-01-08], y: ["x"]}, 
    %{date: ~D[2017-01-09], y: ["x"]}, %{date: ~D[2017-01-10], y: ["x"]}, 
    %{date: ~D[2017-01-11], y: ["x"]}, %{date: ~D[2017-01-12], y: ["x"]}, 
    %{date: ~D[2017-01-13], y: ["x"]}, %{date: ~D[2017-01-14], y: ["x"]}, 
    %{date: ~D[2017-01-15], y: ["x"]}, %{date: ~D[2017-01-16], y: ["x"]}, 
    %{date: ~D[2017-01-17], y: ["x"]}, %{date: ~D[2017-01-18], y: ["x"]}, 
    %{date: ~D[2017-01-19], y: ["x"]}, %{date: ~D[2017-01-20], y: ["x"]}, 
    %{date: ~D[2017-01-21], y: ["x"]}, %{date: ~D[2017-01-22], y: ["x"]}, 
    %{date: ~D[2017-01-23], y: ["x"]}, %{date: ~D[2017-01-24], y: ["x"]}, 
    %{date: ~D[2017-01-25], y: ["x"]}, %{date: ~D[2017-01-26], y: ["x"]}, 
    %{date: ~D[2017-01-27], y: ["x"]}, %{date: ~D[2017-01-28], y: ["x"]}, 
    %{date: ~D[2017-01-29], y: ["x"]}, %{date: ~D[2017-01-30], y: ["x"]}, 
    %{date: ~D[2017-01-31], y: ["x"]}], 
[%{date: ~D[2017-02-01], y: ["x"]}, %{date: ~D[2017-02-02], y: ["x"]}, 
    %{date: ~D[2017-02-03], y: ["x"]}]] 
Verwandte Themen