각도 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.