【问题标题】:Validate time slots are overlaping with each other - javascript验证时隙彼此重叠 - javascript
【发布时间】:2021-03-15 13:49:41
【问题描述】:

我有一个页面,我们可以在其中为给定项目添加可用时间段。这些时隙可以添加到任何订单中,但所选时隙不应与其他时隙重叠。所以,在我保存之前,我需要验证所有添加的时隙是否相互重叠。我的计划是为此添加两个 forloops。但我想知道还有另一种方法可以用更少的编码更有效地做到这一点。请分享您对此的看法。

在给定的图像中,09:00 - 11:00 与 08:00 - 10:00 重叠。所以它不应该允许保存。

我正在尝试添加如下未完成的 for 循环。我想知道还有另一种方法可以轻松做到这一点。

    function isAnOverlapEvent (inputs) {
    var i;
    var matchingList;

    for (i = 0; i < inputs.length; i++) {
        var item = inputs[i];
        matchingList = inputs;

        matchingList.splice(item.index, 1);

        for (k = 0; k < matchingList.length; k++) {
            
        }                
    }
    return false;
}

有人可以帮我解决这个问题吗?

【问题讨论】:

  • 你能提供inputs的结构和一些示例数据吗?另外,您如何保留现有的时间段?

标签: javascript jquery arrays


【解决方案1】:

长话短说,添加时间段后,您应该将其与已经存在的时间段进行比较,并确保它在每个现有时间段开始之前结束,或者在现有时间段结束之后开始。

如果您想了解有关日期(或时间)比较的更多详细信息,可以阅读this very detailed answer。

const existingTimeslots = [{start: 8, end: 10}, {start: 12, end: 14}, {start: 14, end: 16}];

const isNewSlotValid = (newSlot) => {
  let isValid = true;
  
  for(let i = 0; i < existingTimeslots.length; i++) {
    if((existingTimeslots[i].end > newSlot.start) && (existingTimeslots[i].end <= newSlot.end)) {
      isValid = false;
    }
  }
  
  return isValid;
}

console.log(isNewSlotValid({start: 9, end: 11})); // Should return false
console.log(isNewSlotValid({start: 16, end: 18})); // Should return true

【讨论】:

  • 感谢您的回答。如果我们一次添加一个新插槽并保存它,那很好。如果用户也可以更新以前添加的插槽怎么办?例如,他们可以根据需要将 08:00-10:00 更新为 07:00-11:00。但最后,整体添加的插槽不应重叠。这就是为什么我想使用两个 for 循环。占用一个插槽并与所有其他插槽检查。
  • 在这种情况下,我认为您可以创建一个新函数 isUpdatedSlotValid ,该函数将采用 2 个参数:新插槽和不由用户更新的插槽列表。它的工作方式应该与 isNewSlotValid 函数相同。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-09-09
  • 2021-08-31
  • 1970-01-01
  • 1970-01-01
  • 2021-03-20
  • 1970-01-01
相关资源
最近更新 更多