Допустим, у меня есть список объектов даты. Я хотел бы разделить их в новый список по месяцам, и этот список будет добавлен в другой список. Который в итоге стал List<List<DateTime>>
.
{
[2020-12-25],
[2020-12-25],
[2020-11-24],
[2020-10-23]
}
to
[
[2020-12-25,2020-12-25],
[2020-11-24],
[2020-10-23]
]
Что я пробовал в песочнице
void test(List<DateTime> datelist) {
List<List<DateTime> mainList = [];
datelist.forEach((date){
if (mainlist.isEmpty == true) {
List<DateTime> temp = [];
temp.add(date);
mainList.add(temp);
} else {
mainList.forEach((monthList) {
if (monthList.first.month == date.month) {
monthList.add(date);
} else {
List<DateTime> temp = [];
temp.add(date);
mainList.add(temp);
}
});
}
});
}
Но попала ошибка: Uncaught Error: concurrent modification during iteration: Instance of 'JSArray<List<DateTime>>
.
@RandalSchwartz, черт возьми, мой плохой. Я хотел по месяцам. спасибо, что указали.
Что-то вроде этого должно работать:
void main() async {
var dates = <DateTime>[
DateTime(2020, 12, 25),
DateTime(2020, 12, 25),
DateTime(2020, 11, 24),
DateTime(2020, 10, 23)];
var monthMap = Map<int, List<DateTime>>();
for (final date in dates) {
var list = monthMap[date.month];
if (list == null) {
list = [date];
monthMap[date.month] = list;
} else {
list.add(date);
}
}
List<List<DateTime>> mainList = monthMap.values.toList();
print("[" + mainList.map((e) {
return "[${e.map((d) => "${d.year}-${d.month}-${d.day}").join(", ")}]";
}).join(", ") + "]");
}
Ваши данные выглядят так, как будто вы группируете их по дате, а не по месяцу. Чего ты хочешь?