首页 > 解决方案 > 中断并继续

问题描述

我想知道是否有人可以为我澄清一些事情。我有一些代码可以根据不同的值检查数组的重叠值。基本上它的行和comumns 中的谷歌表的内容就是GAS。我现在拥有的是

  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那段代码吗?

感谢人们

编辑:说得太早了。即使继续,代码仍然失败。挠头继续

标签: javascript

解决方案


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

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

只会记录a,因为它会在到达 continue 时跳回循环的开头。但是,如果您移动continue到循环的最后一行(就像在您的代码中一样)它什么也不做,因为它会跳到循环的开头一行之后,所以它只是跳过一个空行。

我以为 break 会回到外部循环

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

现在真正的问题是splice改变了索引,所以如果你拼接出第四个元素,第五个元素变成第四个元素,但是循环继续到第五个元素而不再次检查第四个元素(现在是一个不同的元素)。因此,您必须在中断之前返回一个元素:

 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
     }
   }
 }

海事组织:

for(const [i, value] of arr.entries()1 )我赞成for..in

2)您很快就会忘记什么arr[i][2],为索引提供正确的名称使其更具可读性:

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

3)e是一个坏名字。


推荐阅读