[javascript] 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.
         }
      }
   }
}



답변

펄처럼

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 문서]

C와는 달리이 레이블은 Javascript에는와 같이 continue및 에만 사용할 수 break있습니다 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 군중을 기쁘게해야합니다. 단점은 내부 루프가 종료되기 전에 현재 반복을 완료해야하기 때문에 일부 시나리오에서는 적용되지 않을 수 있습니다.


답변

나는 이것이 정말 오래된 주제라는 것을 알고 있지만 표준 접근 방식이 아직 여기에 없기 때문에 미래의 Google 직원을 위해 게시한다고 생각했습니다.

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 + "<br />";
                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;
}


답변

JavaScript에서 중첩 루프를 해제하는 5 가지 방법은 다음과 같습니다.

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();