在JavaScript中打破嵌套循环的最好方法是什么?

在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("<a href=\""
+ Navigation.Headings[Heading][Item].URL + "\">"
+ Navigation.Headings[Heading][Item].Name + "</a> : ");
break; // <---HERE, I need to break out of two loops.
}
}
}
}
355935 次浏览

将其打包到一个函数中,然后输入return

就像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节定义。# EYZ0

与C语言不同,这些标签只能用于continuebreak,因为Javascript没有goto

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 + "<br />";
if (x == z && z == 2) {
return;
}
}
}
})();  // here, you execute your anonymous function
}

这是怎么回事?:)

我有点晚了,但下面是一种语言无关的方法,它不使用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人群。缺点是,内部循环需要在终止之前完成当前迭代,因此它可能不适用于某些场景。

很简单:

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;
}
XXX.Validation = function() {
var ok = false;
loop:
do {
for (...) {
while (...) {
if (...) {
break loop; // Exist the outermost do-while loop
}
if (...) {
continue; // skips current iteration in the while loop
}
}
}
if (...) {
break loop;
}
if (...) {
break loop;
}
if (...) {
break loop;
}
if (...) {
break loop;
}
ok = true;
break;
} while(true);
CleanupAndCallbackBeforeReturning(ok);
return ok;
};

我意识到这是一个非常老的话题,但由于我的标准方法还没有在这里,我想我把它发布给未来的谷歌人。

var a, b, abort = false;
for (a = 0; a < 10 && !abort; a++) {
for (b = 0; b < 10 && !abort; b++) {
if (condition) {
doSomeThing();
abort = true;
}
}
}

不使用中断,不使用中止标志,不使用额外的条件检查。这个版本只是在条件满足时爆炸循环变量(使它们为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
}
}
}
}
}

如果你使用Coffeescript,有一个方便的“do”关键字,可以更容易地定义并立即执行匿名函数:

do ->
for a in first_loop
for b in second_loop
if condition(...)
return

...所以你可以简单地使用“return”来退出循环。

我想我应该展示一种函数式编程方法。你可以跳出嵌套的Array.prototype.some()和/或Array.prototype.every()函数,就像我的解决方案一样。这种方法的另一个好处是,Object.keys()只枚举对象自己的可枚举属性,而" for-in循环也枚举原型链中的属性"

接近OP的解决方案:

    Args.forEach(function (arg) {
// This guard is not necessary,
// since writing an empty string to document would not change it.
if (!getAnchorTag(arg))
return;


document.write(getAnchorTag(arg));
});


function getAnchorTag (name) {
var res = '';


Object.keys(Navigation.Headings).some(function (Heading) {
return Object.keys(Navigation.Headings[Heading]).some(function (Item) {
if (name == Navigation.Headings[Heading][Item].Name) {
res = ("<a href=\""
+ Navigation.Headings[Heading][Item].URL + "\">"
+ Navigation.Headings[Heading][Item].Name + "</a> : ");
return true;
}
});
});


return res;
}

减少标题/项目迭代的解决方案:

    var remainingArgs = Args.slice(0);


Object.keys(Navigation.Headings).some(function (Heading) {
return Object.keys(Navigation.Headings[Heading]).some(function (Item) {
var i = remainingArgs.indexOf(Navigation.Headings[Heading][Item].Name);


if (i === -1)
return;


document.write("<a href=\""
+ Navigation.Headings[Heading][Item].URL + "\">"
+ Navigation.Headings[Heading][Item].Name + "</a> : ");
remainingArgs.splice(i, 1);


if (remainingArgs.length === 0)
return true;
}
});
});

最好的方法是-
1)对第一个和第二个循环中使用的两个数组进行排序。< br > 2)如果item匹配,则打破内循环并保持索引值 3)当开始下一次迭代时,开始内循环,保持索引值

把循环推到极限怎么样

    for(var a=0; a<data_a.length; a++){
for(var b=0; b<data_b.length; b++){
for(var c=0; c<data_c.length; c++){
for(var d=0; d<data_d.length; d++){
a =  data_a.length;
b =  data_b.length;
c =  data_b.length;
d =  data_d.length;
}
}
}
}

前面已经由swilliams提到过,但下面有一个例子(Javascript):

// Function wrapping inner for loop
function CriteriaMatch(record, criteria) {
for (var k in criteria) {
if (!(k in record))
return false;


if (record[k] != criteria[k])
return false;
}


return true;
}


// Outer for loop implementing continue if inner for loop returns false
var result = [];


for (var i = 0; i < _table.length; i++) {
var r = _table[i];


if (!CriteriaMatch(r[i], criteria))
continue;


result.add(r);
}

下面是打破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();

嗯,嗨,10岁生日派对?

为什么不在你的申请中加上一些条件呢?

var condition = true
for (var i = 0 ; i < Args.length && condition ; i++) {
for (var j = 0 ; j < Args[i].length && condition ; j++) {
if (Args[i].obj[j] == "[condition]") {
condition = false
}
}
}

像这样你想停就停

在我的例子中,使用Typescript,我们可以使用some()遍历数组,并在条件满足时停止 所以我的代码变成这样:

Args.some((listObj) => {
return listObj.some((obj) => {
return !(obj == "[condition]")
})
})

像这样,循环在条件满足后立即停止

提示:此代码在TypeScript中运行

上面有许多优秀的解决方案。 在我看来,如果你的中断条件是例外, 可以使用try-catch:

try{
for (var i in set1) {
for (var j in set2) {
for (var k in set3) {
throw error;
}
}
}
}catch (error) {


}

赋给处于比较条件的值

function test(){
for(var i=0;i<10;i++)
{
for(var j=0;j<10;j++)
{
if(somecondition)
{
//code to Break out of both loops here
i=10;
j=10;
}
                    

}
}


//Continue from here

一个使用for .. of的例子,靠近检查abort条件的再往上举个例子:

test()
function test() {
var arr = [1, 2, 3,]
var abort = false;
for (var elem of arr) {
console.log(1, elem)


for (var elem2 of arr) {
if (elem2 == 2) abort = true;
if (!abort) {
console.log(2, elem2)
}
}
}
}
  • 条件1 -外部循环-将始终运行
  • 投票和接受最多的答案也适用于这种for循环。

结果:内部循环将按预期运行一次

1 1
2 1
1 2
1 3