我想知道是否有人可以为我澄清一些事情。我有一些代码可以检查数组中是否有重叠值,具体取决于不同的值。基本上,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
那段代码?
感谢人们
编辑:发言太早。即使继续,代码仍然会失败。头部抓挠继续
答案 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++;
}
}