Angular JS mematahkan ForEach

256

Saya memiliki loop foreach sudut dan saya ingin istirahat dari loop jika saya cocok dengan nilai. Kode berikut tidak berfungsi.

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

Bagaimana saya bisa mendapatkan ini?

Bocah Chubby
sumber
1
Saya tidak mengerti mengapa Anda tidak hanya menemukan nilai alih-alih melakukan perulangan. Mungkin contoh yang Anda berikan tidak menceritakan keseluruhan cerita, tetapi saya lebih suka melakukan apa yang dikatakan @Aman di bawah. Mengapa masuk ke loop seperti yang disebutkan di bawah ini dan menjalankan pemeriksaan setiap kali ketika beberapa () melakukan hal itu dengan cara yang lebih elegan. Ingat bahwa jika Anda memperlakukan javascript sebagai bahasa fungsional, seharusnya tidak ada gunanya menggunakan ini untuk / sementara / memecah jenis struktur kontrol. Itu sebabnya ada tahu, menemukan, beberapa, dll ada
Adrian Rodriguez

Jawaban:

264

Tidak ada cara untuk melakukan ini. Lihat https://github.com/angular/angular.js/issues/263 . Bergantung pada apa yang Anda lakukan, Anda bisa menggunakan boolean untuk tidak masuk ke dalam loop. Sesuatu seperti:

var keepGoing = true;
angular.forEach([0,1,2], function(count){
  if(keepGoing) {
    if(count == 1){
      keepGoing = false;
    }
  }
});
dnc253
sumber
45
Saya lebih suka hanya menambahkan !keepGoing && return;ke bagian atas fungsi, lebih sedikit kode.
Andrew Joslin
46
Ini bukan praktik terbaik, di sini loop forEach sudut tidak pernah putus, DAN tidak ada yang merusak sudut.forEach. Asli untuk loop sekitar 90% lebih cepat dari sudut. ForEach Jadi lebih baik menggunakan asli untuk loop ketika Anda ingin istirahat pada kondisi yang cocok. Terima kasih
Nishchit Dhanani
Terus terang di mana saya terjebak ... dan ini membantu ... terima kasih banyak ... Bagaimanapun saya ingin tahu alasan membuat forEach loop unbreakable. Jika ada
Saurabh Tiwari
Ini seharusnya bukan jawaban yang diterima karena tidak merusak loop forEach. Ini hanya cara untuk tidak menjalankan semua logika di dalam loop.
Nebulosar
296

The angular.forEachLoop tidak dapat mematahkan pada pertandingan kondisi.

Saran pribadi saya adalah menggunakan loop NATIVE FOR sebagai gantinya angular.forEach.

Loop NATIVE FOR sekitar 90% lebih cepat daripada loop lainnya.

Untuk istirahat loop, untuk hasil tes loop

GUNAKAN UNTUK loop DI ANGULAR:

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.');
}
Nishchit Dhanani
sumber
1
Ini tidak bekerja untuk saya. Yang dilakukannya hanyalah menyelesaikan iterasi khusus dari loop ini. Tapi kemudian pindah ke iterasi berikutnya.
Ben
1
@ Ben, maaf ben, itu adalah kesalahan saya tapi sekarang saya memperbarui jawaban saya setelah penelitian panjang. Saya harap ini akan membantu Anda. Terima kasih
Nishchit Dhanani
1
@LGama: - Apa kasusmu ??
Nishchit Dhanani
3
jsperf.com/angular-foreach-performance mengujinya di browser Anda sendiri untuk memutuskan fungsi mana yang harus Anda pilih. Saya telah menguji pada IE11 dan juga secepat di screenshot. Juga diuji Array.some () tetapi lebih lambat maka Array.forEach () pada IE11 tetapi bisa lebih cepat dari angular.foreach ;-). Atau coba di sini jsperf.com/angular-foreach-vs-native (semua kredit jatuh ke penulis asli, bukan saya ;-))
Sebastian
6
Bahkan dengan jsperf Anda tidak bisa mengatakan "asli untuk sekitar 90% lebih cepat". Dalam skenario Anda ini sangat tergantung pada seberapa mahal pelaksanaan fungsi dalam dan berapa banyak eksekusi dapat diselamatkan dengan keluar dari loop (istirahat) awal.
hgoebl
22

silakan gunakan beberapa atau setiap contoh 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.

Contoh untuk beberapa:

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

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

Contoh untuk setiap:

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

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

Temukan informasi lebih lanjut
http://www.jsnoob.com/2013/11/26/how-to-break-the-foreach/

Neo Vijay
sumber
no @ AngelS.Moreno, semua orang lebih suka menggunakan variabel lokal daripada metode yang dirancang khusus untuk kasing ini
Oded Niv
18

Gunakan Metode Array Some

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

ada akan mengembalikan true, dan Anda dapat menggunakan ini sebagai variabel dalam fungsi Anda

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

Array Some Method - Javascript

Aman Fahimullah
sumber
4
Bagi saya, satu-satunya alasan untuk menggunakan angular.forEach()adalah bahwa saya harus mendukung IE8, yang tidak memiliki Array.forEach()... atau Array.some().
Bennett McElwee
2
Anda dapat polyfill Array. ForEach dengan mudah. Lihat bagian bawah halaman: developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…
zumalifeguard
6

Sejauh yang saya tahu, Angular tidak menyediakan fungsi seperti itu. Anda mungkin ingin menggunakan find()fungsi garis bawah untuk ini (itu pada dasarnya forEach yang keluar dari loop setelah fungsi mengembalikan true).

http://underscorejs.org/#find

mna
sumber
ini mungkin menyelesaikan masalah secara lateral, tetapi tidak dalam akta memutus perulangan.
Elise Chant
Atau asli untuk loop
shanti
6

Jika Anda menggunakan jQuery (maka bukan jqLite) bersama dengan AngularJS Anda dapat mengulangi dengan $ .each - yang memungkinkan pemecahan dan melanjutkan berdasarkan pada ekspresi nilai pengembalian boolean.

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
    }
});

catatan:

Meskipun menggunakan jQuery tidak buruk, baik fungsi Array.some atau Array.every asli direkomendasikan oleh MDN karena Anda dapat membaca di dokumentasi forEach asli :

"Tidak ada cara untuk menghentikan atau memutus loop forEach. Solusinya adalah menggunakan Array. Setiap atau Array. Beberapa"

Contoh-contoh berikut disediakan oleh MDN:

Array. Beberapa:

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. Setiap:

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
conceptdeluxe
sumber
6

Secara konkret, Anda dapat keluar dari forEachloop, dan di mana saja, melempar pengecualian.

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

Namun, lebih baik jika Anda menggunakan pustaka lain atau mengimplementasikan fungsi Anda sendiri, findfungsi dalam kasus ini, sehingga kode Anda paling tinggi.

Victor Aguilar
sumber
10
Nah, Anda memang menjawab pertanyaan itu! Saya harap tidak ada yang melakukan hal itu :)
Jason Cox
Melempar pengecualian secara tidak perlu bukanlah cara yang baik untuk menangani situasi. Alih-alih memeriksa solusi yang disediakan oleh @ dnc253 stackoverflow.com/a/13844508/698127
Aamol
4

Coba ini sebagai istirahat;

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

Sebagai jawaban lain menyatakan, Angular tidak menyediakan fungsi ini. Namun jQuery melakukannya, dan jika Anda telah memuat jQuery dan juga Angular, Anda dapat menggunakannya

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

Lihat http://api.jquery.com/jquery.each/

Nik Dow
sumber
2
OP meminta solusi AngularJS, jawaban yang benar adalah TIDAK :)
Shannon Hochkins
3

Biasanya tidak ada cara untuk memutus loop "setiap" di javascript. Yang bisa dilakukan biasanya adalah menggunakan metode "korsleting".

    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.')
    }

Downhillski
sumber
2

break tidak mungkin untuk dicapai dalam forEach sudut, kita perlu memodifikasi forEach untuk melakukan itu.

$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
                  }
                });
rb4bhushan
sumber
Jawaban ini sepertinya tidak lengkap. Harap tunjukkan apakah break()perlu ditentukan atau apakah itu sudah merupakan bagian dari sudut. Silakan tentukan jika tidak.
geoidesic
2

Anda bisa menggunakan ini:

var count = 0;
var arr = [0,1,2];
for(var i in arr){
   if(count == 1) break;
   //console.log(arr[i]);
}
endrcn
sumber
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)
            }

        }      
    });
});
pengguna1693371
sumber
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;
     });
 }
solanki ...
sumber
0

Saya lebih suka melakukan ini dengan kembali. Letakkan bagian perulangan di fungsi pribadi dan kembali ketika Anda ingin memutus loop.

PrabaharanKathiresan
sumber
0

Saya menyadari ini sudah tua, tetapi filter array dapat melakukan apa yang Anda butuhkan:

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

Anda kemudian dapat menjalankan arr.forEachdan fungsi array lainnya.

Saya menyadari bahwa jika Anda bermaksud untuk mengurangi operasi loop sama sekali, ini mungkin tidak akan melakukan apa yang Anda inginkan. Untuk itu sebaiknya Anda gunakan while.

Garis pantai
sumber
0

Contoh ini berhasil. Cobalah.

var array = [0,1,2];
for( var i = 0, ii = array.length; i < ii; i++){
  if(i === 1){
   break;
  }
}
Maikel Rosabal
sumber
1
Saya kira dia tidak ingin forloop, kasus penggunaannya foreachtidak formungkin
Hassen Ch.
0

Gunakan Return untuk memutus loop.

angular.forEach([0,1,2], function(count){
  if(count == 1) {
    return;
  }
});
Shanmugarajan
sumber
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;
    }
}
poovarasi sekar
sumber
-1

Saya akan menggunakan returnsebagai gantinya break.

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

Bekerja seperti pesona.

Aakash
sumber
ini bukan solusi yang valid. lihat: tes fungsi () {angular.forEach ([1,2,3,4,5,6,7,8,9], fungsi (nilai, indeks) {jika (nilai == 2) kembali; console.log (value);})} output:> teste (); 1 3 4 5 6 7 8 9
otaviodecampos
-2

Cukup tambahkan $ index dan lakukan yang berikut ini:

angular.forEach([0,1,2], function(count, $index) {
     if($index !== 1) {
          // do stuff
     }
}
Sultan
sumber
OP ingin keluar dari loop.
Angel S. Moreno