从 javascript 数组列表中查找连续登录时间
Find consecutive login timings from javascript array list
我在 javascript 中有一个对象数组,其中有员工登录时间。我想知道员工是否连续工作超过 5 小时,然后 he/she 就会休息。否则,如果员工工作超过 5 小时,但不是连续工作,则他们不会休息。
这是代码 - 它目前只检查员工的工作小时数,但不检查连续的小时数。
checkBreakTimings() {
let breakTimes = "";
const timings = [
{
timeIn: '11:00',
timeOut: '12:00',
},
{
timeIn: '12:00',
timeOut: '13:00',
},
{
timeIn: '14:00',
timeOut: '16:00',
},
{
timeIn: '16:00',
timeOut: '18:00',
}
];
let h = 0;
timings.forEach(e => {
const ms = moment(e.timeOut, "HH:mm").diff(moment(e.timeIn, "HH:mm"));
h = h + = Number(moment.duration(ms).asHours());
});
if(h > 5 )
{
breakTimes = "Yes";
}
}
return breakTimes;
}
从上面的时间可以看出,一名员工从 14:00 到 18:00 连续工作了 6 小时 8 小时,此处将应用休息时间,但以上 2 个时间是连续不超过5小时。
我的问题是 - 有什么方法可以使用 JavaScript 或 moment.js
从数组中找出连续的小时数
这是一个可以解决问题的函数
function isAllowedBrake(times) {
let isAllowed = false
let consecutive = 0;
let lastVal
times.forEach((e) => {
if (lastVal && moment(lastVal, "HH:mm").isBefore(moment(e.timeIn, "HH:mm"))) {
consecutive = 0
}
const ms = moment(e.timeOut, "HH:mm").diff(moment(e.timeIn, "HH:mm"));
let duration = Number(moment.duration(ms).asHours())
consecutive += duration
lastVal = e.timeOut
})
if (consecutive > 5) {
isAllowed = true;
}
return isAllowed;
}
像下面的片段一样尝试:
const checkBreakTimings = () => {
let breakTimes = "";
const timings = [
{timeIn: '11:15', timeOut: '12:00', },
{timeIn: '12:00', timeOut: '13:00', },
{timeIn: '13:00', timeOut: '15:46', },
{timeIn: '16:00', timeOut: '18:00', }
];
let h = 0;
let consecutive = 0
let lastOut = null
timings.forEach(e => {
const ms = moment(e.timeOut, "HH:mm").diff(moment(e.timeIn, "HH:mm"));
let worked = Number(moment.duration(ms).asHours())
consecutive = worked
if (lastOut === e.timeIn) { // compare if timeIn is equal to last timeOut and sum values
consecutive += worked
} else consecutive = 0
lastOut = e.timeOut
if (consecutive > 5) breakTimes = "Yes" // it's more then 5 hours
h = h + Number(moment.duration(ms).asHours());
});
console.log(breakTimes);
}
checkBreakTimings()
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.29.1/moment.min.js" integrity="sha512-qTXRIMyZIFb8iQcfjXWCO8+M5Tbc38Qi5WzdPOYZHIlZpzBHG3L3by84BBBOiRGiEb7KKtAOAs5qYdUiZiQNNQ==" crossorigin="anonymous" referrerpolicy="no-referrer"></script>
我在 javascript 中有一个对象数组,其中有员工登录时间。我想知道员工是否连续工作超过 5 小时,然后 he/she 就会休息。否则,如果员工工作超过 5 小时,但不是连续工作,则他们不会休息。
这是代码 - 它目前只检查员工的工作小时数,但不检查连续的小时数。
checkBreakTimings() {
let breakTimes = "";
const timings = [
{
timeIn: '11:00',
timeOut: '12:00',
},
{
timeIn: '12:00',
timeOut: '13:00',
},
{
timeIn: '14:00',
timeOut: '16:00',
},
{
timeIn: '16:00',
timeOut: '18:00',
}
];
let h = 0;
timings.forEach(e => {
const ms = moment(e.timeOut, "HH:mm").diff(moment(e.timeIn, "HH:mm"));
h = h + = Number(moment.duration(ms).asHours());
});
if(h > 5 )
{
breakTimes = "Yes";
}
}
return breakTimes;
}
从上面的时间可以看出,一名员工从 14:00 到 18:00 连续工作了 6 小时 8 小时,此处将应用休息时间,但以上 2 个时间是连续不超过5小时。
我的问题是 - 有什么方法可以使用 JavaScript 或 moment.js
从数组中找出连续的小时数这是一个可以解决问题的函数
function isAllowedBrake(times) {
let isAllowed = false
let consecutive = 0;
let lastVal
times.forEach((e) => {
if (lastVal && moment(lastVal, "HH:mm").isBefore(moment(e.timeIn, "HH:mm"))) {
consecutive = 0
}
const ms = moment(e.timeOut, "HH:mm").diff(moment(e.timeIn, "HH:mm"));
let duration = Number(moment.duration(ms).asHours())
consecutive += duration
lastVal = e.timeOut
})
if (consecutive > 5) {
isAllowed = true;
}
return isAllowed;
}
像下面的片段一样尝试:
const checkBreakTimings = () => {
let breakTimes = "";
const timings = [
{timeIn: '11:15', timeOut: '12:00', },
{timeIn: '12:00', timeOut: '13:00', },
{timeIn: '13:00', timeOut: '15:46', },
{timeIn: '16:00', timeOut: '18:00', }
];
let h = 0;
let consecutive = 0
let lastOut = null
timings.forEach(e => {
const ms = moment(e.timeOut, "HH:mm").diff(moment(e.timeIn, "HH:mm"));
let worked = Number(moment.duration(ms).asHours())
consecutive = worked
if (lastOut === e.timeIn) { // compare if timeIn is equal to last timeOut and sum values
consecutive += worked
} else consecutive = 0
lastOut = e.timeOut
if (consecutive > 5) breakTimes = "Yes" // it's more then 5 hours
h = h + Number(moment.duration(ms).asHours());
});
console.log(breakTimes);
}
checkBreakTimings()
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.29.1/moment.min.js" integrity="sha512-qTXRIMyZIFb8iQcfjXWCO8+M5Tbc38Qi5WzdPOYZHIlZpzBHG3L3by84BBBOiRGiEb7KKtAOAs5qYdUiZiQNNQ==" crossorigin="anonymous" referrerpolicy="no-referrer"></script>