使用reduce

时间:2019-06-01 17:26:35

标签: javascript arrays ecmascript-6

场景

我有一组对象,其中有多个用户(出席时间,出勤时间)。我正在尝试使用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,它是小时数,这是在第一次迭代中计算出来的,这导致了计算问题,我尝试了多种方法,但我没有提出有关如何减少这种工作的解决方案。

1 个答案:

答案 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...。

对于输入/输出对,您还没有指定如果数据不匹配该怎么办,但这应该适用于正确的数据。