在Javascript中打破嵌套循环的最佳方法是什么?
//Write the links to the page. for (var x = 0; x < Args.length; x++) { for (var Heading in Navigation.Headings) { for (var Item in Navigation.Headings[Heading]) { if (Args[x] == Navigation.Headings[Heading][Item].Name) { document.write("" + Navigation.Headings[Heading][Item].Name + " : "); break; // <---HERE, I need to break out of two loops. } } } }
ephemient.. 927
就像Perl一样
loop1: for (var i in set1) { loop2: for (var j in set2) { loop3: for (var k in set3) { break loop2; // breaks out of loop3 and loop2 } } }
如EMCA-262第12.12节中的定义.[MDN Docs]
与C不同,这些标签只能用于continue
和break
,因为Javascript没有goto
.
就像Perl一样
loop1: for (var i in set1) { loop2: for (var j in set2) { loop3: for (var k in set3) { break loop2; // breaks out of loop3 and loop2 } } }
如EMCA-262第12.12节中的定义.[MDN Docs]
与C不同,这些标签只能用于continue
和break
,因为Javascript没有goto
.
将其包裹在一个函数中然后只是return
.
我有点迟到了,但以下是与语言无关的方法,不使用GOTO /标签或功能包装:
for (var x = Set1.length; x > 0; x--) { for (var y = Set2.length; y > 0; y--) { for (var z = Set3.length; z > 0; z--) { z = y = -1; // terminates second loop // z = y = x = -1; // terminate first loop } } }
在好的方面,它自然流动,这应该取悦非GOTO人群.在缺点方面,内部循环需要在终止之前完成当前迭代,因此在某些情况下可能不适用.
我意识到这是一个非常古老的话题,但由于我的标准方法还没有到来,我想我会把它发布给未来的googlers.
var a, b, abort = false; for (a = 0; a < 10 && !abort; a++) { for (b = 0; b < 10 && !abort; b++) { if (condition) { doSomeThing(); abort = true; } } }
var str = ""; for (var x = 0; x < 3; x++) { (function() { // here's an anonymous function for (var y = 0; y < 3; y++) { for (var z = 0; z < 3; z++) { // you have access to 'x' because of closures str += "x=" + x + " y=" + y + " z=" + z + "
"; if (x == z && z == 2) { return; } } } })(); // here, you execute your anonymous function }
怎么样?:)
非常简单
var a=[1,2,3]; var b=[4,5,6]; var breakCheck1=false; for (var i in a){ for (var j in b){ breakCheck1=true; break; } if (breakCheck1) {break;} }
如何完全不使用中断,没有中止标志,也没有额外的条件检查.这个版本只是Number.MAX_VALUE
在满足条件时抛出循环变量(使它们)并强制所有循环优雅地终止.
// No breaks needed for (var i = 0; i < 10; i++) { for (var j = 0; j < 10; j++) { if (condition) { console.log("condition met"); i = j = Number.MAX_VALUE; // Blast the loop variables } } }
对于递减类型的嵌套循环,有一个类似的答案,但是这适用于递增类型的嵌套循环,而不需要考虑简单循环的每个循环的终止值.
另一个例子:
// No breaks needed for (var i = 0; i < 89; i++) { for (var j = 0; j < 1002; j++) { for (var k = 0; k < 16; k++) { for (var l = 0; l < 2382; l++) { if (condition) { console.log("condition met"); i = j = k = l = Number.MAX_VALUE; // Blast the loop variables } } } } }
以下是打破JavaScript中的嵌套循环的五种方法:
1)将父循环设置为结尾
for (i = 0; i < 5; i++) { for (j = 0; j < 5; j++) { if (j === 2) { i = 5; break; } } }
2)使用标签
exit_loops: for (i = 0; i < 5; i++) { for (j = 0; j < 5; j++) { if (j === 2) break exit_loops; } }
3)使用变量
var exit_loops = false; for (i = 0; i < 5; i++) { for (j = 0; j < 5; j++) { if (j === 2) { exit_loops = true; break; } } if (exit_loops) break; }
4)使用自我执行功能
(function() { for (i = 0; i < 5; i++) { for (j = 0; j < 5; j++) { if (j === 2) return; } } })();
5)使用常规功能
function nested_loops() { for (i = 0; i < 5; i++) { for (j = 0; j < 5; j++) { if (j === 2) return; } } } nested_loops();
如何将循环推到最终限制
for(var a=0; a