Функция не дожидается выполнения итераций с массивом и возвращает пустой массив. NodeJS

Рейтинг: 0Ответов: 2Опубликовано: 04.05.2023

Функция должна пробегать по массиву расписаний в формате JSON, находить там преподавателей, если преподаватель уже встречался, то просто добавляем расписание в массив к преподавателю, если нет то создаём новый объект и так же добавляем. Но пытаясь получить финальный массив код возвращает пустоту [], но при вызове console.log(teacherSchedule) корректно выводит массив.

/**
 * Функция для получения расписания преподавателей из расписания групп
 */
async function readTeacherSchedule(){

    var allSchedules = await db_logic.getTeacherSchedule(); 
    var teacherSchedule = [];
    
    for(var i = 0; i < allSchedules.length; i++){

        var itemList = await JSON.parse(allSchedules[i]['schedule'])

        for(var j = 0; j < await itemList.length; j++) {

            var item = await itemList[j]

            if(!teacherSchedule.hasOwnProperty(item['Host'])){

                   // Совпадение не найдено, добавляем преподавателя в массив
                    teacherSchedule[item['Host']] = []
                    teacherSchedule[item['Host']].push(item)
            }
            else{
                   
                   // Проверка на повторение событий
                   if(! teacherSchedule[await item['Host']].includes(await item)){
                        teacherSchedule[await item['Host']].push(await item)
                   }
            }

               console.log(teacherSchedule.length)

        }
    }


    console.log("1")
    console.log(teacherSchedule.length)
    console.log("2")

}

Ответы

▲ 0Принят

Думаю, ваша проблема не в асинхронности, а в неправильном подходе к обработке данных.

Нужно сделать хранилище ключ-значение и ключом сделать фамилию преподавателя. Используйте для этого Map.

// Обёртка для примера
const db_logic = {
  getTeacherSchedule: async () => {
    return [
      { schedule: '[{"WeekDayNumber":2,"WeekType":1,"EventNumber":3,"Name":"Эксплуатация и обслуживание котлов и котельно-вспомогательного оборудования","Type":"лекция","Host":"Марченко Андрей Владимирович","faculty":"ГТК","Location":"03-ТЭС-3"},{"WeekDayNumber":2,"WeekType":2,"EventNumber":3,"Name":"Эксплуатация и обслуживание котлов и котельно-вспомогательного оборудования","Type":"лекция","Host":"Марченко Андрей Владимирович","faculty":"ГТК","Location":"03-ТЭС-3"}]' }
    ];
  },
};

async function readTeacherSchedule() {
  const allSchedules = await db_logic.getTeacherSchedule();

  const teacherSchedule = allSchedules.reduce(
    (acc, record) => {
      const list = JSON.parse(record.schedule);
      for (const item of list) {
        const key = item.Host;
        if (!acc.has(key)) {
          acc.set(key, []);
        }
        acc.get(key).push(item);
      }
      return acc;
    },
    new Map()
  );

  return Array.from(teacherSchedule.values());
}

(async () => {
  const result = await readTeacherSchedule();
  console.log(result);
})();

▲ 0

Еще вариант:

// Обёртка для примера
const db_logic = {
    getTeacherSchedule: async () => {
        return [
            { schedule: '[{"WeekDayNumber":2,"WeekType":1,"EventNumber":3,"Name":"Эксплуатация и обслуживание котлов и котельно-вспомогательного оборудования","Type":"лекция","Host":"Марченко Андрей Владимирович","faculty":"ГТК","Location":"03-ТЭС-3"},{"WeekDayNumber":2,"WeekType":2,"EventNumber":3,"Name":"Эксплуатация и обслуживание котлов и котельно-вспомогательного оборудования","Type":"лекция","Host":"Марченко Андрей Владимирович","faculty":"ГТК","Location":"03-ТЭС-3"}]' },
            { schedule: '[{"WeekDayNumber":3,"WeekType":1,"EventNumber":4,"Name":"тема лекции 1","Type":"лекция","Host":"Иванов И.И.","faculty":"ГТК","Location":"03-ТЭС-3"},{"WeekDayNumber":2,"WeekType":2,"EventNumber":3,"Name":"Тема лекци 2","Type":"лекция","faculty":"ГТК","Location":"03-ТЭС-3"}]' }
        ];
    },
};

(async () => {
    const allSchedules = await db_logic.getTeacherSchedule();
    result =  allSchedules.map(item => JSON.parse(item.schedule)).flat()
        .reduce((obj,item) => {obj[item.Host] ? obj[item.Host].push(item) : obj[item.Host] = [item]; return obj},{});
    
    console.log(result);
    console.log(Object.entries(result));
})();