场景
我有一组对象,其中有多个用户(出席时间,出勤时间)。我正在尝试使用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
};
});
目标
我也希望输出像Follow
{
"name": "Test User",
"id": 35,
"hours": 3.0213888888888887
},
问题
似乎计算不正确,因为第一次迭代后返回的值将是firstEle,它是小时数,这是在第一次迭代中计算出来的,这导致了计算问题,我尝试了多种方法,但我没有提出有关如何减少这种工作的解决方案。
答案 0 :(得分:0)
如果您只想要非常简洁的代码
emp.Attendance.reduce(
([result, lastIn], { time, type }) =>
type === 'OUT' ? [result + (new Date(time) - lastIn)] : [result, new Date(time)],
[0],
) /
(1000 * 60 * 60);
对于您的数据,它返回5.2502...。
对于输入/输出对,您还没有指定如果数据不匹配该怎么办,但这应该适用于正确的数据。