Mam kątową pętlę foreach i chcę zerwać z pętli, jeśli dopasuję wartość. Poniższy kod nie działa.
angular.forEach([0,1,2], function(count){
if(count == 1){
break;
}
});
Jak mogę to zdobyć?
Mam kątową pętlę foreach i chcę zerwać z pętli, jeśli dopasuję wartość. Poniższy kod nie działa.
angular.forEach([0,1,2], function(count){
if(count == 1){
break;
}
});
Jak mogę to zdobyć?
Odpowiedzi:
Nie ma na to sposobu. Zobacz https://github.com/angular/angular.js/issues/263 . W zależności od tego, co robisz, możesz użyć wartości logicznej, aby po prostu nie wchodzić w ciało pętli. Coś jak:
var keepGoing = true;
angular.forEach([0,1,2], function(count){
if(keepGoing) {
if(count == 1){
keepGoing = false;
}
}
});
!keepGoing && return;na górze funkcji, mniej kodu.
angular.forEachPętla nie może złamać na stan meczu.
Moją osobistą radą jest użycie zamiast tego pętli NATIVE FORangular.forEach .
Pętla NATIVE FOR jest około 90% szybsza niż inne dla pętli.

UŻYJ DO PĘTLI W KĄTU:
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.');
}
użyj niektórych lub wszystkich wystąpień 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.
Przykład dla niektórych:
var ary = ["JavaScript", "Java", "CoffeeScript", "TypeScript"];
ary.some(function (value, index, _ary) {
console.log(index + ": " + value);
return value === "JavaScript";
});
Przykład dla każdego:
var ary = ["JavaScript", "Java", "CoffeeScript", "TypeScript"];
ary.every(function(value, index, _ary) {
console.log(index + ": " + value);
return value.indexOf("Script") > -1;
});
Znajdź więcej informacji
http://www.jsnoob.com/2013/11/26/how-to-break-the-foreach/
Użyj metody Array Some
var exists = [0,1,2].some(function(count){
return count == 1
});
istnieje, zwróci true, i możesz użyć tego jako zmiennej w swojej funkcji
if(exists){
console.log('this is true!')
}
angular.forEach()jest to, że muszę obsługiwać IE8, który nie ma Array.forEach()... lub Array.some().
O ile mi wiadomo, Angular nie zapewnia takiej funkcji. Możesz do tego użyć find()funkcji podkreślenia (jest to w zasadzie forEach, który wyłamuje się z pętli, gdy funkcja zwróci wartość true).
Jeśli używasz jQuery (stąd nie jqLite) w połączeniu z AngularJS, możesz iterować z $ .each - co pozwala na łamanie i kontynuowanie w oparciu o wyrażenie logiczne.
JSFiddle:
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
}
});
Uwaga:
Chociaż za pomocą jQuery nie jest zła, zarówno rodzimych Array.some lub Array.every funkcje są zalecane przez MDN jak można przeczytać na rodzimym foreach dokumentacji:
„Nie ma możliwości zatrzymania lub przerwania pętli forEach. Rozwiązaniem jest użycie Array.every lub Array.some”
MDN zapewnia następujące przykłady:
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
Konkretnie, możesz wyjść z forEachpętli i z dowolnego miejsca, rzucić wyjątek.
try {
angular.forEach([1,2,3], function(num) {
if (num === 2) throw Error();
});
} catch(e) {
// anything
}
Lepiej jest jednak użyć innej biblioteki lub zaimplementować własną funkcję, findw tym przypadku funkcję, więc kod ma najwyższy poziom.
Jak podają inne odpowiedzi, Angular nie zapewnia tej funkcjonalności. jQuery działa jednak, a jeśli załadowałeś jQuery oraz Angular, możesz użyć
jQuery.each ( array, function ( index, value) {
if(condition) return false; // this will cause a break in the iteration
})
Zwykle nie ma sposobu na przerwanie pętli „each” w javascript. Co zwykle można zrobić, to zastosować metodę „zwarcia”.
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.')
}
break nie jest możliwe do osiągnięcia w forEach kątowym, musimy zmodyfikować forEach, aby to zrobić.
$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()należy zdefiniować, czy jest to już część kąta. Proszę określić, jeśli nie.
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)
}
}
});
});
$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;
});
}
Wolałbym to zrobić w drodze powrotnej. Umieść część zapętloną w funkcji prywatnej i wróć, gdy chcesz przerwać pętlę.
Wiem, że to stare, ale filtr tablicowy może zrobić to, czego potrzebujesz:
var arr = [0, 1, 2].filter(function (count) {
return count < 1;
});
Następnie można uruchomić arr.forEachi inne funkcje tablicowe.
Zdaję sobie sprawę, że jeśli zamierzasz całkowicie ograniczyć operacje na pętli, prawdopodobnie nie zrobi to, co chcesz. Do tego najlepiej wykorzystać while.
Ten przykład działa. Spróbuj.
var array = [0,1,2];
for( var i = 0, ii = array.length; i < ii; i++){
if(i === 1){
break;
}
}
forpętli, jego przypadek użycia foreachnie wymaga forchyba
Użyj Return, aby przerwać pętlę.
angular.forEach([0,1,2], function(count){
if(count == 1) {
return;
}
});
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;
}
}
Użyłbym returnzamiast break.
angular.forEach([0,1,2], function(count){
if(count == 1){
return;
}
});
Działa jak marzenie.
Po prostu dodaj $ index i wykonaj następujące czynności:
angular.forEach([0,1,2], function(count, $index) {
if($index !== 1) {
// do stuff
}
}