Angular JSブレークForEach


256

角度のあるforeachループがあり、値が一致した場合にループから抜け出したいと思います。次のコードは機能しません。

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

どうすれば入手できますか?


1
ループに入るのではなく、なぜ値を見つけないのか分かりません。多分あなたが与えた例は話全体を語っていないかもしれませんが、私はむしろ@アマンが以下に言ったようにしたいと思います。なぜ以下に述べるようにループに入り、some()がよりエレガントな方法で正確にそれを行うたびにチェックを実行するのですか?JavaScriptを関数型言語として扱う場合、これらのfor / while / breakタイプの制御構造を使用しても意味がないことに注意してください。これが、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;関数の先頭にを追加するだけで、コードは少なくなります。
アンドリュージョスリン

46
これはベストプラクティスではありません。ここでは、angular forEachループが中断することはなく、angular.forEachを中断するものはありません。ネイティブのforループはangular.forEachよりも約90%高速です。したがって、条件一致でブレークしたい場合は、ネイティブのforループを使用することをお勧めします。ありがとう
Nishchit Dhanani 2014年

xcatly私がスタックしたところ...そしてこれは助けになりました...トンに感謝します...とにかく私はforEachループを壊れないようにする理由を知りたいのですが。もしあれば
Saurabh Tiwari

これは、forEachループを中断しないため、受け入れられた答えであってはなりません。これは、ループ内ですべてのロジックを実行しない方法に他なりません。
Nebulosar

296

angular.forEachループは、条件一致でブレークすることはできません。

私の個人的なアドバイスは、の代わりにNATIVE FORループを使用することですangular.forEach

NATIVE FORループは、他のforループよりも約90%高速です。

ループブレーク用、ループテスト結果用

角度での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
これは私にはうまくいきません。ループのこの特定の反復を完了するだけです。しかし、それは次の反復に進みます。
ベン・

1
@ベン、申し訳ありませんがベン、それは私の間違いでしたが、今は長い研究の後に私の答えを更新します。これがお役に立てば幸いです。ありがとう
Nishchit Dhanani 2014年

1
@LGama:-あなたのケースは何ですか?
Nishchit Dhanani 2014

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 2015

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/


いいえ@ AngelS.Moreno、誰もが手元のケースのために特別に設計されたメソッドの代わりにローカル変数を使用することを好む
Oded Niv

18

Array someメソッドを使用する

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

existsはtrueを返し、これを関数の変数として使用できます

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

いくつかのメソッドの配列-JavaScript


4
私にとって、使用する唯一の理由angular.forEach()は、IEをサポートする必要があることです。IE8はArray.forEach()...またはをサポートしていませんArray.some()
Bennett McElwee 2014年

2
Array.forEachを簡単にポリフィルできます。:ページの下部を参照してくださいdeveloper.mozilla.org/en-US/docs/Web/JavaScript/Reference/...
zumalifeguard

6

私の知る限り、Angularはそのような関数を提供していません。find()これにはアンダースコアの関数を使用することをお勧めします(基本的には、関数がtrueを返すとループから抜け出すforEachです)。

http://underscorejs.org/#find


これは問題を横方向に解決するかもしれませんが、実際にループを壊すことはありません。
Elise Chant

またはネイティブforループ
シャンティ2017年

6

AngularJSと組み合わせてjQuery(したがってjqLit​​eではない)を使用する場合は、$。eachを使用して反復できます。これにより、ブール戻り値式に基づいて中断および続行できます。

JSFiddle:

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

JavaScript:

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の使用は悪くありませんが、ネイティブのforEachドキュメントで読むことができるように、MDN ではネイティブの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は実行し、jQueryとAngularをロードしている場合は、

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は、正しい答えはNOです:)、AngularJSソリューションを求めて
シャノンHochkins

3

通常、JavaScriptの「各」ループを解除する方法はありません。通常できることは「短絡」法を使用することです。

    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()定義する必要があるかどうか、それがすでに角度の一部であるかどうかを示してください。ない場合は定義してください。
ジオイデシック2016

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
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 3 4 5 6 7 8 9
otaviodecampos

-2

$ indexを追加して、以下を実行してください:

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

OPがループから抜け出したい。
エンジェルS.モレノ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.