Создать новый вложенный список

Допустим, у меня есть список объектов даты. Я хотел бы разделить их в новый список по месяцам, и этот список будет добавлен в другой список. Который в итоге стал 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>>.

Ваши данные выглядят так, как будто вы группируете их по дате, а не по месяцу. Чего ты хочешь?

Randal Schwartz 25.12.2020 07:11

@RandalSchwartz, черт возьми, мой плохой. Я хотел по месяцам. спасибо, что указали.

Eric Low 25.12.2020 07:16
0
2
51
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Что-то вроде этого должно работать:

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(", ") + "]");
  
} 

Другие вопросы по теме