2017-09-29 6 views
0

私は日付を含むマップのリストを持っています。私はそのリストがどれくらいの長さであるかは分かりません(何年にもわたることがあります)。私が知っているのは、リストは日付でソートされていて、重複した日付はないということです。日のリストを日のリストを含む月のリストに分割します

例:

[ 
%{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"]} 
] 

私は日が含まれている月のリストが欲しい:

[ 
[ 
%{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"]} 
] 
] 

各ヶ月が異なる長さ(プラスうるう年の問題を)持っているので、私はどのように考えていますリストを分割する。これはできますか?

+1

FWIW、 'Enum.group_by/3 'あなたの前の質問に対する答えで3時間前に導入されたのは、簡単に同じトリックです(' Enum.chunk_by/2'は間違いなく良い選択です): 'list |> Enum.group_by(fn%{date: %{年:年、月:月}} - > {年、月}終了)|> Map.values'。 – mudasobwa

答えて

2

私はEnum.chunk_by/2を使用して、コールバック関数の各要素の日付と年のタプルを返します。これにより、年または月が変更されるたびにリストが分割されます。 (あなたのリストは、例えば2016年1月1日は、2017年1月1日に続いて含まれている場合だけmonthが正しく動作しません。)

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 

出力:

[[%{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"]}]] 
関連する問題