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;}
}
중단 없음, 중단 플래그 없음 및 추가 조건 검사 없음을 사용하는 것은 어떻습니까? 이 버전 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에서 중첩 루프를 해제하는 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();
루프를 끝까지 밀어 넣는 방법
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;
}
}
}
}
Coffeescript를 사용하는 경우 익명 함수를 쉽게 정의하고 즉시 실행할 수있는 편리한 "do"키워드가 있습니다.
do ->
for a in first_loop
for b in second_loop
if condition(...)
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;
}
});
});
이전에 swilliams가 이미 언급 했지만 아래 예제 (자바 스크립트)가 있습니다.
// 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);
}
흠 안녕 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에서 실행됩니다.
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;
};
가장 좋은 방법은
-1) 첫 번째와 두 번째 루프에서 사용되는 두 배열을 정렬합니다.
2) 항목이 일치하면 내부 루프를 끊고 색인 값을 유지하십시오.
3) 다음 반복을 시작할 때 홀드 인덱스 값으로 내부 루프를 시작하십시오.
'Programing' 카테고리의 다른 글
Android에서 ListViews 사이의 줄을 어떻게 제거합니까? (0) | 2020.02.25 |
---|---|
확인란이 선택된 경우 jQuery (0) | 2020.02.25 |
배열을 포함하는 PHP 상수? (0) | 2020.02.25 |
IIS AppPoolIdentity 및 파일 시스템 쓰기 액세스 권한 (0) | 2020.02.25 |
로그 아웃 : GET 또는 POST? (0) | 2020.02.25 |