각도 JS 휴식 ForEach


256

각도 foreach 루프가 있고 값과 일치하면 루프에서 벗어나고 싶습니다. 다음 코드는 작동하지 않습니다.

angular.forEach([0,1,2], function(count){
  if(count == 1){
    break;
  }
});

이걸 어떻게 얻을 수 있습니까?


1
왜 루프에 들어 가지 않고 값을 찾지 못하는지 이해하지 못합니다. 어쩌면 당신이 제공 한 예가 전체 이야기를 말하지는 않지만 @Aman이 아래에서 말한 것을 수행하고 싶습니다. 아래에 언급 된 것처럼 루프에 들어가서 some () 이보다 우아한 방식으로 정확하게 수행 할 때마다 검사를 실행하는 이유는 무엇입니까? 자바 스크립트를 기능적 언어로 취급하는 경우 이러한 유형의 제어 구조에 대해 / 동안 / 중단 유형을 사용할 필요는 없습니다. 그래서 foreach, find, some 등이 존재합니다
— Adrian Rodriguez

답변:


264

이를 수행 할 방법이 없습니다. https://github.com/angular/angular.js/issues/263을 참조 하십시오 . 수행중인 작업에 따라 부울을 사용하여 루프 본문으로 들어 가지 않을 수 있습니다. 다음과 같은 것 :

var keepGoing = true;
angular.forEach([0,1,2], function(count){
  if(keepGoing) {
    if(count == 1){
      keepGoing = false;
    }
  }
});

45
오히려 !keepGoing && return;코드 상단에 함수 상단에 a 를 추가하고 싶습니다 .
— Andrew Joslin

46
이것은 모범 사례가 아니며, angular forEach 루프는 절대로 깨지지 않으며 angular.forEach를 깰 수있는 것은 없습니다. 기본 for 루프는 angular.forEach보다 약 90 % 빠릅니다. 따라서 조건 일치를 중단하려는 경우 기본 for 루프를 사용하는 것이 좋습니다. 감사합니다
— Nishchit Dhanani

xcatly 내가 붙어있는 곳에서 ... 그리고 이것은 도움이되었습니다. 매우 감사합니다 ... 어쨌든 forEach 루프를 깨지지 않는 이유를 알고 싶습니다. 있다면
— Saurabh Tiwari

forEach 루프를 중단하지 않으므로 허용되는 대답이 아니어야합니다. 루프 내부의 모든 논리를 실행하지 않는 방법입니다.
— 성운

296

그만큼 angular.forEach루프는 조건 일치에 분리 할 수 없습니다.

내 개인적인 조언은 대신 NATIVE FOR 루프 를 사용하는 것입니다 angular.forEach.

NATIVE FOR 루프는 다른 for 루프보다 약 90 % 빠릅니다.

루프 브레이크, 루프 테스트 결과

ANGULAR에서 FOR 루프 사용 :

var numbers = [0, 1, 2, 3, 4, 5];

for (var i = 0, len = numbers.length; i < len; i++) {
  if (numbers[i] === 1) {
    console.log('Loop is going to break.'); 
    break;
  }
  console.log('Loop will continue.');
}

1
이것은 나를 위해 작동하지 않습니다. 루프의 특정 반복을 완료하기 만하면됩니다. 그러나 다음 반복으로 넘어갑니다.
— Ben

1
@ Ben, 죄송합니다 ben, 그것은 내 실수 였지만 지금은 오랜 연구 끝에 내 대답을 업데이트합니다. 이것이 도움이되기를 바랍니다. 감사합니다
— Nishchit Dhanani

1
@LGama :-당신의 사건은 무엇입니까 ??
— Nishchit Dhanani

3
jsperf.com/angular-foreach-performance 자신의 브라우저에서 테스트하여 어떤 기능을 선택해야하는지 결정하십시오. IE11에서 테스트했으며 스크린 샷만큼 빠릅니다. Array.some ()도 테스트했지만 IE11의 Array.forEach ()보다 느리지 만 angular.foreach ;-)보다 빠를 수 있습니다. 또는 jsperf.com/angular-foreach-vs-native ( 여기서 모든 크레디트는 나 자신이 아닌 원저에게 보낸다 ;-))
— Sebastian

6
jsperf를 사용하더라도 "기본은 약 90 % 빠릅니다"라고 말할 수 없습니다. 시나리오에서 이는 내부 함수의 실행 비용과 루프 (중단)를 일찍 종료하여 저장할 수있는 실행 수에 따라 크게 달라집니다.
— hgoebl

22

ForEach의 일부 또는 모든 인스턴스를 사용하십시오.

Array.prototype.some:
some is much the same as forEach but it break when the callback returns true

Array.prototype.every:
every is almost identical to some except it's expecting false to break the loop.

일부 예 :

var ary = ["JavaScript", "Java", "CoffeeScript", "TypeScript"];

ary.some(function (value, index, _ary) {
    console.log(index + ": " + value);
    return value === "JavaScript";
});

모든 예 :

var ary = ["JavaScript", "Java", "CoffeeScript", "TypeScript"];

ary.every(function(value, index, _ary) {
    console.log(index + ": " + value);
    return value.indexOf("Script") > -1;
});

자세한 정보는 http://www.jsnoob.com/2013/11/26/how-to-break-the-foreach/를 찾으십시오
.


no @ AngelS.Moreno, 모두가 직접 수작업을 위해 고안된 방법 대신 지역 변수를 사용하는 것을 선호합니다
— Oded Niv

18

Array Some 메서드 사용

 var exists = [0,1,2].some(function(count){
      return count == 1
 });

존재하면 true를 반환하고 함수에서 변수로 사용할 수 있습니다.

if(exists){
    console.log('this is true!')
}

일부 메소드 배열-Javascript


4
나에게 사용하는 유일한 이유 angular.forEach()는 Array.forEach()... 또는가없는 IE8을 지원해야하기 때문 Array.some()입니다.
— Bennett McElwee

2
Array.forEach를 쉽게 채울 수 있습니다. 페이지 하단 참조 : developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…
— zumalifeguard

6

내가 아는 한 Angular는 그러한 기능을 제공하지 않습니다. 이를 위해 밑줄 find()함수 를 사용할 수 있습니다 (기본적으로 함수가 true를 반환하면 루프에서 벗어나는 forEach입니다).

http://underscorejs.org/#find


이것은 문제를 측면으로 해결할 수 있지만 실제로 루프를 중단하지는 않습니다.
— 엘리스 챈트

또는 네이티브 for 루프
— shanti

6

AngularJS와 함께 jQuery (따라서 jqLite가 아님)를 사용하면 $ .each를 반복하여 부울 리턴 값 표현식을 기반으로 중단하고 계속할 수 있습니다.

JSFiddle :

http://jsfiddle.net/JEcD2/1/

자바 스크립트 :

var array = ['foo', 'bar', 'yay'];
$.each(array, function(index, element){
    if (element === 'foo') {
        return true; // continue
    }
    console.log(this);
    if (element === 'bar') {
        return false; // break
    }
});

노트 :

jQuery를 사용하는 것은 나쁘지 않지만 MDN은 기본 forEach 문서를 읽을 수 있으므로 기본 Array.some 또는 Array.every 함수를 모두 권장 합니다.

"forEach 루프를 중지하거나 끊을 방법이 없습니다. 해결책은 Array.every 또는 Array.some을 사용하는 것입니다."

다음 예제는 MDN에서 제공합니다.

Array.some :

function isBigEnough(element, index, array){
    return (element >= 10);
}
var passed = [2, 5, 8, 1, 4].some(isBigEnough);
// passed is false
passed = [12, 5, 8, 1, 4].some(isBigEnough);
// passed is true

Array.every :

function isBigEnough(element, index, array){
    return (element >= 10);
}
var passed = [12, 5, 8, 130, 44].every(isBigEnough);
// passed is false
passed = [12, 54, 18, 130, 44].every(isBigEnough);
// passed is true

6

구체적으로, forEach루프를 종료 하고 어느 곳에서나 예외를 던질 수 있습니다.

try {
   angular.forEach([1,2,3], function(num) {
      if (num === 2) throw Error();
   });
} catch(e) {
    // anything
}

그러나 다른 라이브러리를 사용하거나이 경우 함수 인 자체 함수를 구현하는 것이 좋습니다 find. 따라서 코드의 수준이 가장 높습니다.


10
글쎄, 당신은 질문에 대답했습니다! 그래도 아무도 그렇게하지 않기를 바랍니다 :)
— Jason Cox

불필요하게 예외를 던지는 것은 상황을 처리하는 좋은 방법이 아닙니다. 오히려 @ dnc253에서 제공하는 솔루션을 확인하십시오 stackoverflow.com/a/13844508/698127
— Aamol

4

이것을 휴식으로 시도하십시오.

angular.forEach([0,1,2], function(count){
  if(count == 1){
    return true;
  }
});

3

다른 답변에서 알 수 있듯이 Angular는이 기능을 제공하지 않습니다. 그러나 jQuery는 수행하며, Angular뿐만 아니라 jQuery도로드 한 경우

jQuery.each ( array, function ( index, value) {
    if(condition) return false; // this will cause a break in the iteration
})

http://api.jquery.com/jquery.each/를 참조하십시오.


2
OP는 AngularJS 솔루션을 요청
— 했는데

3

일반적으로 자바 스크립트에서 "각"루프를 해제 할 수있는 방법이 없습니다. 일반적으로 할 수있는 것은 "단락"방법을 사용하는 것입니다.

    array.forEach(function(item) {
      // if the condition is not met, move on to the next round of iteration.
      if (!condition) return;

      // if the condition is met, do your logic here
      console.log('do stuff.')
    }


2

break 각 forEach에서 달성 할 수없는 경우, 우리는 forEach를 수정해야합니다.

$scope.myuser = [{name: "Ravi"}, {name: "Bhushan"}, {name: "Thakur"}];  
                angular.forEach($scope.myuser, function(name){
                  if(name == "Bhushan") {
                    alert(name);
                    return forEach.break(); 
                    //break() is a function that returns an immutable object,e.g. an empty string
                  }
                });

이 답변은 완전하지 않은 것 같습니다. break()정의 해야하는지 또는 이미 각도의 일부 인지 표시하십시오 . 그렇지 않은 경우 정의하십시오.
— geoidesic

2

이것을 사용할 수 있습니다 :

var count = 0;
var arr = [0,1,2];
for(var i in arr){
   if(count == 1) break;
   //console.log(arr[i]);
}

1
var ary = ["JavaScript", "Java", "CoffeeScript", "TypeScript"];
var keepGoing = true;
ary.forEach(function(value, index, _ary) {
    console.log(index)
    keepGoing = true;
    ary.forEach(function(value, index, _ary) {
        if(keepGoing){ 
            if(index==2){
                keepGoing=false;
            }
            else{
                console.log(value)
            }

        }      
    });
});

0
$scope.arr = [0, 1, 2];  
$scope.dict = {}
for ( var i=0; i < $scope.arr.length; i++ ) {
    if ( $scope.arr[i] == 1 ) {
        $scope.exists = 'yes, 1 exists';
        break;
    }
 }
 if ( $scope.exists ) {
     angular.forEach ( $scope.arr, function ( value, index ) {
                      $scope.dict[index] = value;
     });
 }

0

나는 이것을 돌려주는 것을 선호합니다. 루핑 부분을 전용 함수에 넣고 루프를 끊고 싶을 때 돌아갑니다.


0

나는 이것이 오래되었다는 것을 알고 있지만 배열 필터는 필요한 것을 할 수 있습니다.

var arr = [0, 1, 2].filter(function (count) {
    return count < 1;
});

그런 다음 arr.forEach다른 어레이 기능 을 실행할 수 있습니다 .

루프 작업을 완전히 줄이려면 원하는 것을 수행하지 않을 것입니다. 이를 위해 가장 잘 사용하십시오 while.


0

이 예제는 효과가 있습니다. 시도 해봐.

var array = [0,1,2];
for( var i = 0, ii = array.length; i < ii; i++){
  if(i === 1){
   break;
  }
}

1
나는 그가 for루프를 원하지 않는다고 생각합니다 . 그의 유스 케이스 foreach에는 for아마
— Hassen Ch.

0

루프를 해제하려면 Return 키를 사용하십시오.

angular.forEach([0,1,2], function(count){
  if(count == 1) {
    return;
  }
});

0
onSelectionChanged(event) {
    let selectdata = event['api']['immutableService']['gridOptionsWrapper']['gridOptions']['rowData'];
    let selected_flag = 0;

    selectdata.forEach(data => {
      if (data.selected == true) {
        selected_flag = 1;
      }
    });

    if (selected_flag == 1) {
      this.showForms = true;
    } else {
      this.showForms = false;
    }
}

-1

return대신에 사용하겠습니다 break.

angular.forEach([0,1,2], function(count){
  if(count == 1){
    return;
  }
});

매력처럼 작동합니다.


이것은 유효한 솔루션이 아닙니다. look : function test () {angular.forEach ([1,2,3,4,5,6,7,8,9], function (value, index) {if (value == 2) return; console.log (값);})} 출력 :> teste (); 1 34 5 6 7 8 9
— otaviodecampos

-2

$ index를 추가하고 다음을 수행하십시오.

angular.forEach([0,1,2], function(count, $index) {
     if($index !== 1) {
          // do stuff
     }
}

OP는 루프에서 벗어나기를 원합니다.
— Angel S. Moreno
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.