我有一個角度foreach循環,如果我匹配一個值,我想從循環中斷開。以下代碼不起作用。Angular JS break ForEach
angular.forEach([0,1,2], function(count){
if(count == 1){
break;
}
});
我怎樣才能得到這個?
我有一個角度foreach循環,如果我匹配一個值,我想從循環中斷開。以下代碼不起作用。Angular JS break ForEach
angular.forEach([0,1,2], function(count){
if(count == 1){
break;
}
});
我怎樣才能得到這個?
有沒有辦法做到這一點。見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;
}
}
});
我寧願只在函數的頂部添加'!keepGoing && return;'代碼。 –
這不是最佳實踐,這裏angular for each循環永遠不會中斷,並且沒有什麼可以打破angular.forEach。原生for循環比angular.forEach快90%左右。因此,當您想要在條件匹配時斷開時,最好使用native for循環。謝謝 –
@AndyJoslin這不是一個有效的JavaScript代碼。 –
據我所知,Angular不提供這樣的功能。您可能需要使用下劃線的find()
函數(它基本上是一個forEach,一旦函數返回true,它就會跳出循環)。
這可能會橫向解決問題,但它並沒有打破循環。 –
或原生循環 – shanti
angular.forEach
循環無法在條件匹配時斷開。
我的個人建議是使用NATIVE爲循環而不是angular.forEach
。
NATIVE FOR循環大約爲90%比其他for循環更快。
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.');
}
使用一些方法
var exists = [0,1,2].some(function(count){
return count == 1
});
存在將返回true數組,你可以使用這個作爲一個變量你的功能
if(exists){
console.log('this is true!')
}
對我來說,使用'angular.forEach()'的唯一原因是我必須支持IE8,它沒有'Array.forEach()'...或'Array.some()' 。 –
您可以輕鬆地填充Array.forEach。見頁面底部:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/forEach – zumalifeguard
如果與AngularJS結合使用jQuery(因此不jqLite),你可以用$。每次迭代 - 它允許突破,並繼續基於布爾返回值表達式。
的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
}
});
注:
雖然使用jQuery也不錯,無論是本地Array.some或Array.every功能由MDN推薦你可以在本地forEach文檔閱讀使用說明:
「沒有辦法停止或中斷forEach循環。解決方案是使用Array.every或Array。由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
只需加$指數並執行以下操作:
angular.forEach([0,1,2], function(count, $index) {
if($index !== 1) {
// do stuff
}
}
OP想擺脫循環。 –
請使用的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。莫雷諾,每個人都喜歡使用本地變量,而不是專門爲手中的情況設計的方法 –
具體而言,您可以退出forEach
循環,並在任何地方拋出異常。
try {
angular.forEach([1,2,3], function(num) {
if (num === 2) throw Error();
});
} catch(e) {
// anything
}
但是,它是更好,如果你使用其他庫或實現自己的功能,在這種情況下find
功能,讓你的代碼是最高層。
嗯,你確實回答了這個問題!我希望沒有人那樣做:) –
不必要地拋出異常不是處理這種情況的好方法。而是檢查由@ dnc253提供的解決方案http://stackoverflow.com/a/13844508/698127 – Aamol
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)
}
}
});
});
由於其他答案狀態,Angular不提供此功能。然而jQuery不會的,如果你已加載的jQuery以及角度,你可以使用
jQuery.each (array, function (index, value) {
if(condition) return false; // this will cause a break in the iteration
})
OP要求的AngularJS解決方案,正確的答案是否:) –
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
正常情況下沒有辦法突破在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.')
}
您可以使用此:
var count = 0;
var arr = [0,1,2];
for(var i in arr){
if(count == 1) break;
//console.log(arr[i]);
}
$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;
});
}
我寧願用回做到這一點。將循環部分放在私有函數中,並在您想要中斷循環時返回。
這個例子有效。嘗試一下。
var array = [0,1,2];
for(var i = 0, ii = array.length; i < ii; i++){
if(i === 1){
break;
}
}
我想他不想要'for'循環,他的用例需要'foreach'而不是'for' –
我意識到這是舊的,但一個濾鏡陣列可以做你的需要:
var arr = [0, 1, 2].filter(function (count) {
return count < 1;
});
然後,您可以運行arr.forEach
等陣列功能。
我意識到,如果你打算完全減少循環操作,這可能不會做你想要的。爲此,你最好使用while
。
試試這個休息;
angular.forEach([0,1,2], function(count){
if(count == 1){
return true;
}
});
我不明白你爲什麼不只是找到值而不是進入循環。也許你給出的例子並不是講完整個故事,但我寧願做下面的@Aman所說的。爲什麼要像下面提到的那樣進入循環,並且每當有些()以更優雅的方式完成時,就執行檢查。請記住,如果您將javascript作爲功能語言對待,那麼使用這些for/while/break類型的控制結構應該沒有意義。這就是爲什麼foreach,find,some等存在的原因 –