Сценарий
У меня есть массив объектов с несколькими пользователями с их посещаемостью (по времени, по времени). Я пытаюсь использовать Array .prototype .reduce () для минимизации кода.
Ниже приведен пример объекта / массива, вход и выход могут быть больше в зависимости от пользователя.
"temp": [
{
"name": "Test User",
"id": 35,
"Attendance": [
{
"id": 34890,
"employee_code": "AL028",
"date": "2018-11-20",
"time": "2018-11-20T10:11:06.000Z",
"flag": "0\t1\t0\t0\t0",
"type": "IN"
},
{
"id": 34904,
"employee_code": "AL028",
"date": "2018-11-20",
"time": "2018-11-20T13:12:23.000Z",
"flag": "1\t1\t0\t0\t0",
"type": "OUT"
},
{
"id": 34914,
"employee_code": "AL028",
"date": "2018-11-20",
"time": "2018-11-20T13:46:18.000Z",
"flag": "0\t1\t0\t0\t0",
"type": "IN"
},
{
"id": 34943,
"employee_code": "AL028",
"date": "2018-11-20",
"time": "2018-11-20T16:00:02.000Z",
"flag": "1\t1\t0\t0\t0",
"type": "OUT"
},
]
}
]
код
Пожалуйста, игнорируйте несколько переменных, которые я сохранил для регистрации
let temp = attendances;
let mappedAttendance = temp.map(emp => {
let hours = 0,i=0;
const empHours = emp.Attendance.reduce((firstEle, secondEle) => {
if (
firstEle.type === "IN" &&
secondEle.type === "OUT" &&
(firstEle !== undefined && secondEle !== undefined)
) {
hours +=
Math.abs(
new Date(firstEle.time).getTime() -
new Date(secondEle.time).getTime()
) / 36e5;
}
i++;
return hours;
});
return {
name: emp.name,
id: emp.id,
hours: empHours
};
});
Цель
Также я хочу, чтобы вывод был следующим:
{
"name": "Test User",
"id": 35,
"hours": 3.0213888888888887
},
Задача
Кажется, что он не рассчитывается должным образом, так как после первой итерации возвращаемое значение будет firstEle, и это часы, которые вычисляются на первой итерации, и это вызывает проблему для расчета, я пробовал несколько способов, но я не подхожу с решением о том, как заставить это уменьшить работу.
UPDATE
Ответ Карамелла был идеальным, но мне все еще трудно достичь следующего условия в уменьшении
Кроме того, мне удалось получить именно то, что я хотел, с помощью следующего,
Как будто есть IN, OUT, OUT, он не будет рассчитывать последний OUT, что я и хотел
let hours = 0;
emp.Attendance.reduce((firstEle, secondEle) => {
if (
firstEle.type === "IN" &&
secondEle.type === "OUT" &&
(firstEle !== undefined && secondEle !== undefined)
) {
hours +=
Math.abs(
new Date(firstEle.time).getTime() -
new Date(secondEle.time).getTime()
) / 36e5;
}
return secondEle;
});