Как мне заполнить отсутствующие во все дни в массиве до сих пор, в котором нет элемента «Present»?

#javascript #html #arrays #ajax #momentjs

#javascript #HTML #массивы #ajax #момент js

Вопрос:

Предположим, что приведенное ниже является массивом, который состоит из данных о посещаемости сотрудника (полученных из Mongo с использованием Ajax):

 [{"_id":"5fcdcd49c3657d1e05b846f5","title":"Present","allDay":true,"start":"2020-11-20","display":"background","color":"#4caf50"},
{"_id":"5fcdcd74c3657d1e05b846f6","title":"Present","allDay":true,"start":"2020-12-07","display":"background","color":"#4caf50"},
{"_id":"5fcebc7653057438acc633a6","title":"Present","allDay":true,"start":"2020-12-08","display":"background","color":"#4caf50"},]
 

Этот массив состоит из элементов в формате JSON.
Когда массив считывается, мы обнаруживаем, что в каждом элементе объект JSON содержит два поля — Start (в котором указывается дата) и Title (в котором указывается, присутствует или отсутствует сотрудник)

Теперь мы замечаем, что в (2020-11-20) есть элемент, указывающий, что сотрудник присутствует. Затем появляется следующий элемент, в котором указывается, что сотрудник присутствует 2020-12-07 (примерно через 17 дней). Согласно моему варианту использования, я предполагаю, что сотрудник отсутствовал в течение этих 17 дней.

Теперь эти 17 дней —

  • 2020-11-21
  • 2020-11-22
  • 2020-11-23
  • до 2020-12-06

Я хотел бы:

 $.ajax(
{
url: "/api/employees/markAttendence/Absent/:date" [We will fill the date obviously, I have left it as :date for illustration]
type: "GET"
}
);
 

на каждый день сотрудник отсутствует.

Я хотел использовать moment.js чтобы вычесть дни из сегодняшнего дня, проверьте, присутствует ли элемент с вычисленным моментом даты. Если элемента нет, я отправляю приведенный выше Ajax-запрос на эту дату.

Как мне это сделать?

Ответ №1:

Я не знаю, сколько вы сделали, поэтому здесь мы начинаем с обработки данных.

С помощью заданных данных я хотел бы извлечь начальную информацию в вызываемый массив presentDate .

 var dataset = [{"_id":"5fcdcd49c3657d1e05b846f5","title":"Present","allDay":true,"start":"2020-11-20","display":"background","color":"#4caf50"},
               {"_id":"5fcdcd74c3657d1e05b846f6","title":"Present","allDay":true,"start":"2020-12-07","display":"background","color":"#4caf50"},
               {"_id":"5fcebc7653057438acc633a6","title":"Present","allDay":true,"start":"2020-12-08","display":"background","color":"#4caf50"},]

var presentDate = dataset.filter(data => data.title === "Present").map(data => data.start);
 

Я пытаюсь работать с Moment.js ним и оглядываюсь назад примерно 30 на несколько дней. Чтобы увидеть, существуют ли какие-либо даты в presentDate и пропустить их.

 var today = moment(moment().format('YYYY-MM-DD'));
var lookBackDays = 30;
var NeedToQuery = [];
for(var index = 1; index <= lookBackDays;   index) {
    var checkDate = moment(today);
    checkDate.subtract(index, 'days');
    var dateString = checkDate.format('YYYY-MM-DD');
    if(presentDate.indexOf(dateString) < 0)
    {
        // Here I store the date string into NeedToQuery
        NeedToQuery.push(dateString);
    }
}
 

Наконец, у вас будет строка даты для отправки Ajax-запроса, удачи.

Ответ №2:

Спасибо @ian00! Я также нашел решение, которое отлично работает.

 function markAbsentism() {
        $.ajax({
          url: "/******/******/*******/",
          type: "GET",
        }).done((result) => {
          var presentDates = [],
            excludedDates = [];
          if (
            moment(result[result.length - 1].start).diff(
              moment(result[result.length - 2].start),
              "days"
            ) == 1 amp;amp;
            (result[result.length - 1].title == "Present" ||
              result[result.length - 1].title == "Absent") amp;amp;
            (result[result.length - 2].title == "Present" ||
              result[result.length - 2].title == "Absent")
          ) {
            console.log("IF_1 SUCCESS");
            return;
          } else {
            console.log("IF_1 FAILED");
            console.log("ELSE_1 EXEC STARTED");
            for (let ctr = result.length - 1; ctr >= 0; ctr--) {
              if (
                result[ctr].title == "Present"
              ) {
                if (presentDates.length <= 2) {
                  console.log("EMPLOYEE PRESENT");
                  presentDates.push(result[ctr].start);
                  excludedDates.push(result[ctr].start);
                } else {
                  console.log("GOT 2 PRESENT DATES. BREAKING LOOP");
                  break;
                }
              } else if (
                result[ctr].title == "Leave" ||
                result[ctr].title == "Holiday" ||
                result[ctr].title == "Half-Day"
              ) {
                console.log("EMPLOYEE IN LEAVE");
                excludedDates.push(result[ctr].start);
              }
            }
            console.log(presentDates);
            console.log(excludedDates);
          }

          console.log("Proceeding to For Loop");

          for (
            let i = 0;
            i <= moment(presentDates[0]).diff(moment(presentDates[1]), "days");
            i  
          ) {
            if (
              excludedDates.includes(
                moment(presentDates[1]).add(i, "days").format("YYYY-MM-DD")
              )
            ) {
              console.log("EXCLUDED DATE CAUGHT CONTINUING");
              continue;
            } else {
              console.log("SENDING AJAX REQUEST");
              $.ajax({
                url:
                  "/******/******/*******/"  
                  moment(presentDates[1]).add(i, "days").format("YYYY-MM-DD"),
                type: "GET",
              });
            }
          }
        });
      }
 

Я попробую даже ваш, чтобы найти самый эффективный.