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

#dart #nested-lists

#dart #вложенные списки

Вопрос:

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

Комментарии:

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

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

Ответ №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(", ")   "]");
  
}