Я предполагаю, что вы хотите, чтобы список всех значений для определенного месяца в конкретном году. Я немного изменил ваш ввод, чтобы включить случаи, когда год или месяц отличаются:
data = [
["2019-01-01", "900"],
["2019-01-01", "150"],
["2019-01-01", "150"],
["2019-01-01", "450"],
["2019-01-01", "180"],
["2018-01-01", "240"],
["2019-02-01", "300"]
]
Я думаю, что самый простой способ добиться этого - сначала разобрать это в соответствующие структуры данных, а затем использовать Enum.group_by
длясгруппировать по {year, month}
парам.
data
|> Enum.map(fn [date, value] ->
# This is the part that parses it into a representation that's easier to work with
[Date.from_iso8601!(date), String.to_integer(value)]
end)
|> Enum.group_by(
# This is the key function - the items will be grouped by this
fn [date, _value] -> {date.year, date.month} end,
# This is the value function - it will gather the results of this function under the keys
fn [_date, value] -> value end
)
В результате:
%{
{2018, 1} => [240],
{2019, 1} => [900, 150, 150, 450, 180],
{2019, 2} => [300]
}
Таким образом, вы можете получить список значений для определенного месяца (в данном случае январь 2019) с помощью:
Map.get(result, {2019, 1}) # => [900, 150, 150, 450, 180]
Или, если вы хотите сумму:
Map.get(result, {2019, 1}) |> Enum.sum() # => 1830