рассчитать разницу в дате в часах, используя уменьшение - PullRequest
1 голос
/ 01 июня 2019

Сценарий

У меня есть массив объектов с несколькими пользователями с их посещаемостью (по времени, по времени). Я пытаюсь использовать 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;
          });

1 Ответ

1 голос
/ 01 июня 2019

Если вы просто хотите получить очень краткий код

emp.Attendance.reduce(
  ([result, lastIn], { time, type }) =>
    type === 'OUT' ? [result + (new Date(time) - lastIn)] : [result, new Date(time)],
  [0],
) /
  (1000 * 60 * 60);

Возвращает 5.2502 ... для ваших данных, что, вероятно, правильно.

Вы не указали, что должно произойти, если данныене совпадает с точки зрения входных / выходных пар, но это должно работать для правильных данных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...