Функция не дожидается выполнения итераций с массивом и возвращает пустой массив. NodeJS
Функция должна пробегать по массиву расписаний в формате 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")
}
Ответы (2 шт):
Автор решения: nörbörnën
→ Ссылка
Думаю, ваша проблема не в асинхронности, а в неправильном подходе к обработке данных.
Нужно сделать хранилище ключ-значение и ключом сделать фамилию преподавателя. Используйте для этого 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);
})();
Автор решения: Билик Санданов
→ Ссылка
Еще вариант:
// Обёртка для примера
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));
})();