#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",
});
}
}
});
}
Я попробую даже ваш, чтобы найти самый эффективный.