打破并继续

时间:2018-08-19 11:24:15

标签: javascript

我想知道是否有人可以为我澄清一些事情。我有一些代码可以检查数组中是否有重叠值,具体取决于不同的值。基本上,GAS是按行和逗号分隔的Google工作表的内容。我现在所拥有的是

  var e = [[2,4,3,4,2],[1,5,3,6,2],[2,4,3,4,1],[1,4,3,6,1],[2,4,3,6,5]];
  var i; //id of entry to check
  var j; //id of element to check
  var k; //id of entry to compare

  for (i in e){ //2D ARRAY ARRAY
      for (k in e){ //ELEMENT TO COMPARE
           if (e[i][2] === e[k][2] && e[i][3] === e[k][3] && e[i][0] && e[i][0] >= e[k][0] && e[i][1] <= e[k][1] && e[i][4] <= e[k][4] &&  i !=k){
             e.splice(i,1);
             continue;
           }
      }
  }
  return e;

我必须添加continue;,否则,如果最后检查的数组也被标记为splice,则代码将失败。但是我假设break可以代替continue起作用,但是由于某种原因它不能起作用。我以为break会返回到外部循环,但是是否会永久break那段代码?

感谢人们

编辑:发言太早。即使继续,代码仍然会失败。头部抓挠继续

2 个答案:

答案 0 :(得分:3)

continue直接跳转到下一个迭代,所以:

  while(true) {
    console.log("a");
    continue;
    console.log("b");
 }

将仅记录a,因为如果到达继续,它将跳回到循环的beginnig。但是,如果将continue移到循环的最后一行(就像在代码中一样)它什么也不做,因为它会在以后跳到循环的第一行,因此只跳过了空行。

  

我认为休息会回到外循环

是的,这就是发生的事情,这实际上是一件好事,就好像您已经删除了该元素一样,检查其他重复对象也没有意义,因为您不想删除两次。

现在真正的问题是splice会更改索引,因此,如果拼接出第四个元素,则fith元素成为第四个元素,但是循环继续到fith元素,而无需再次检查第四个元素(现在已经不一样了)。因此,在中断之前,您必须返回一个元素:

 for(let i = 0; i < e.length; i++) {
   for(let k = 0; k < e.length; k++) {
      if(i === k) continue; // < good usecase
      if(/* equality checks */) {
        e.splice(i, 1); // remove the element
        i--; // go back by one as we changed the order
        break; // exit the inner loop
     }
   }
 }

IMO:

1)我更愿意for(const [i, value] of arr.entries()胜过for..in

2)您将很快忘记arr[i][2]是什么,为索引赋予适当的名称会使其更具可读性:

  const [idA, someValueA] = e[i];
  const [idB, someValueB] = e[k];
  if(idA === idB && someValueA <= someValueB // ...

3)e是一个坏名字。

答案 1 :(得分:2)

您可以使用标记的中断来中断嵌套循环。 例如

var num = 0;
outermost:
for(var i = 0; i < 10; i++){
  for(var j = 0; j < 10 ; j++){
    if(i == 5 && j == 5){
      break outermost;
    }
    num++;
  }
}