如何检查间隔是否中断?

时间:2018-12-01 14:20:41

标签: javascript

假设我在数组中有一个间隔存储列表:

[
 {start: "0", end: "3"}, 
 {start: "4", end: "6"},
 {start: "8", end: "10"}
]

如您所见,第三个间隔从第二个间隔开始是不连续的,因为它应该从7开始而不是从8开始,所以用户创建了一个不连续的间隔。

我想检查该数组内是否有不连续的间隔。

我编写了以下代码:

for (var i = 0; i < array.length; i++) 
{
   for(var x = 0; x < array.length; x++){
      if(array[x] !== array[i] && array[x].start - array[i].end != 1)
        {
          throw new Error(Lang.interval_discontinued);
        }
   }
}
如您所见,

我遍历数组,然后创建一个嵌套循环以比较所有其他间隔。 第一次检查是比较数组是否相等所必需的,如果是,则执行检查无用。 所以我的逻辑是这样:

我用x迭代的结束值减去i迭代的开始值,但这不能解决问题,相反,这令人头疼。

如果我执行console.log(array[x].start , "-" , array[i].end , "=", array[x].start - array[i].end);,则会得到以下事实:

0 - 6 = -6

因此0x迭代(嵌套循环)开始的一部分,而6i迭代(第一循环)的一部分。

也许我忽略了它?还有另一种简单的方法来处理这些东西吗?

谢谢。

3 个答案:

答案 0 :(得分:1)

如果我对您的理解正确,那么您想检查一个元素的末尾与其后一个元素的开始之间是否存在间隙。为此,您不需要嵌套的for循环。试试这个:

function isContinuous(arr) {
  for (var i = 0; i < arr.length-1; i++) {
    if (arr[i].end != arr[i+1].start - 1) return false;
  }
  return true;
}

答案 1 :(得分:1)

您可以简单地使用1 for循环来检查数组中的相邻值。如果不匹配,请记录消息并中断循环。

let array = [{start: "0", end: "3"}, {start: "4", end: "6"},{start: "8", end: "10"}];

for (var i = 1; i < array.length; i++) {
   if(array[i].start - array[i-1].end !== 1) {
     console.log("issue");
     break;
   }
}

答案 2 :(得分:1)

仅在订购后立即循环一次(因此,请确保开始间隔较小)。我在这里检查的是,如果它大于1,则是一个错误(取决于输入的输入方式),否则,将是一个容易的更改

const intervalArray = [
 {start: "0", end: "3"}, 
 {start: "4", end: "6"},
 {start: "8", end: "10"}
];

function getInvalidIntervals( input ) {
  // order by start first
  const copy = input.slice(0).sort( (a, b) => (+a.start) - (+b.start) );
  const failures = [];
  // check against the ordered next value
  for (let i = 0; i < copy.length - 1; i++) {
    if ( (+copy[i+1].start) - (+copy[i].end) > 1) {
      failures.push( copy[i] );
    }
  }
  return failures;
}

console.log( getInvalidIntervals( intervalArray ) );