JavaScript for 루프를 중지하는 방법은 무엇입니까?


128

이 JavaScript를 사용하여 배열을 반복하고 일치하는 배열 요소를 찾습니다.

var remSize = [], 
    szString, remData, remIndex, i;

for (i = 0; i < remSize.length; i++) {      
    // I'm looking for the index i, when the condition is true
    remSize[i].size == remData.size ? remIndex = i : remIndex = -1;     
}

배열에는 다음 "크기"가 포함 ["34", "36", "38"...]됩니다..

remData.size 내가 찾고있는 "크기"입니다 (예 : "36").

i검색중인 크기 가 인덱스에 있으면 인덱스를 반환해야합니다 . 그렇지 않으면 반환해야합니다 -1. 이 작업을 수행하는 더 좋은 방법이 있습니까?

답변:


194

forJavaScript에서 초기에 루프 를 중지하려면 다음을 사용합니다 break.

var remSize = [], 
    szString,
    remData,
    remIndex,
    i;

/* ...I assume there's code here putting entries in `remSize` and assigning something to `remData`... */

remIndex = -1; // Set a default if we don't find it
for (i = 0; i < remSize.length; i++) {      
     // I'm looking for the index i, when the condition is true
     if (remSize[i].size === remData.size) {
          remIndex = i;
          break;       // <=== breaks out of the loop early
     }
}

ES2015 (일명 ES6) 환경에있는 경우이 특정 사용 사례에 대해 Array#findIndex(항목의 색인 Array#find을 찾기 위해 ) 또는 (항목 자체를 찾기 위해) 사용할 수 있으며, 둘 다 shimm / polyfilled 할 수 있습니다.

var remSize = [], 
    szString,
    remData,
    remIndex;

/* ...I assume there's code here putting entries in `remSize` and assigning something to `remData`... */

remIndex = remSize.findIndex(function(entry) {
     return entry.size === remData.size;
});

Array#find:

var remSize = [], 
    szString,
    remData,
    remEntry;

/* ...I assume there's code here putting entries in `remSize` and assigning something to `remData`... */

remEntry = remSize.find(function(entry) {
     return entry.size === remData.size;
});

Array#findIndex콜백이 처음으로 진실 값을 반환 할 때 중지하고 콜백에 대한 해당 호출에 대한 색인을 반환합니다. 그것은 반환 -1콜백이 결코 truthy 값을 반환하지 않는 경우. Array#find또한 찾고자하는 것을 찾으면 멈 춥니 다. 그러나 인덱스가 아닌 항목을 반환합니다 (또는 undefined콜백이 진실 값을 반환하지 않는 경우).

ES5 호환 환경 (또는 ES5 shim)을 사용하는 경우 콜백이 정확한 값을 반환 할 때까지 콜백을 호출하는 새 some함수 를 배열에 사용할 수 있습니다 .

var remSize = [], 
    szString,
    remData,
    remIndex;

/* ...I assume there's code here putting entries in `remSize` and assigning something to `remData`... */

remIndex = -1; // <== Set a default if we don't find it
remSize.some(function(entry, index) {
    if (entry.size === remData.size) {
        remIndex = index;
        return true; // <== Equivalent of break for `Array#some`
    }
});

jQuery를 사용 jQuery.each하는 경우 배열을 반복 하는 데 사용할 수 있습니다 . 다음과 같이 보일 것입니다.

var remSize = [], 
    szString,
    remData,
    remIndex;

/* ...I assume there's code here putting entries in `remSize` and assigning something to `remData`... */

remIndex = -1; // <== Set a default if we don't find it
jQuery.each(remSize, function(index, entry) {
    if (entry.size === remData.size) {
        remIndex = index;
        return false; // <== Equivalent of break for jQuery.each
    }
});

1
return 문을 사용하는 것이 좋은 방법입니다. 감사합니다 @TJ 크라우
techloris_109

@TJ Crowder 어떤 진술이 좋은 접근 방식입니까? false를 반환하거나 중단합니까?
Ilyas 카림

3
@Ilyaskarim : 당신은 당신이 사용하고있는 구조로 하나의 적절한 사용 ( breakA의 for루프 return falsejQuery.each, return truesome, ...).
TJ Crowder

13

대신 ES2015 릴리스의 일부인 for of 루프를 사용하십시오. forEach와 달리 리턴, 중단 및 계속을 사용할 수 있습니다. 참조 https://hacks.mozilla.org/2015/04/es6-in-depth-iterators-and-the-for-of-loop/를

let arr = [1,2,3,4,5];
for (let ele of arr) {
  if (ele > 3) break;
  console.log(ele);
}

ES6 잘 사용,이 여기에 최고의 답변 중 하나라고 생각합니다
에마 드 살라

사실, 나는 이것이 최선의 대답이라고 말하고 싶습니다. 가장 깔끔한 방법입니다 ( "배열 요소를 반복하는 가장 간결하고 직접적인 구문", Mozilla Hacks가 대답의 링크에서 말한 것처럼). 우리는 ES6에 들어간 모든 노력에 대해 우리가 할 수있는 모든 곳에서 새로운 기능을 사용함으로써 보답해야합니다 (그리고 그 과정에서 우리 자신에게 이익이됩니다).
Velojet 2017 년

10

논리가 잘못되었습니다. 항상 배열의 마지막 요소의 결과를 반환합니다.

remIndex = -1;

for (i = 0; i < remSize.length; i++) {      
    if (remSize[i].size == remData.size) {
        remIndex = i
        break;
    }
}

0

나는 이것이 약간 오래되었다는 것을 알고 있지만 for 루프로 배열을 반복하는 대신 메서드를 사용하는 것이 훨씬 쉬울 것입니다. <array>.indexOf(<element>[, fromIndex])

배열을 반복하여 값의 첫 번째 인덱스를 찾아 반환합니다. 값이 배열에 포함되어 있지 않으면 -1을 반환합니다.

<array>살펴볼 배열이고, <element>찾고있는 값이며, [fromIndex]시작할 인덱스입니다 (기본값은 0).

이것이 코드의 크기를 줄이는 데 도움이되기를 바랍니다.


1
이 제목의 질문에 대답하지 않습니다 : How to stop a JavaScript for loop?그것은 않습니다/ 일치의 인덱스를 반환 -1 없음 경우 더 나은 방법이 있나요 .
greybeard
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.