2012-12-12 301 views
222

我有一個角度foreach循環,如果我匹配一個值,我想從循環中斷開。以下代碼不起作用。Angular JS break ForEach

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

我怎樣才能得到這個?

+1

我不明白你爲什麼不只是找到值而不是進入循環。也許你給出的例子並不是講完整個故事,但我寧願做下面的@Aman所說的。爲什麼要像下面提到的那樣進入循環,並且每當有些()以更優雅的方式完成時,就執行檢查。請記住,如果您將javascript作爲功能語言對待,那麼使用這些for/while/break類型的控制結構應該沒有意義。這就是爲什麼foreach,find,some等存在的原因 –

回答

234

有沒有辦法做到這一點。見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; 
    } 
    } 
}); 
+41

我寧願只在函數的頂部添加'!keepGoing && return;'代碼。 –

+40

這不是最佳實踐,這裏angular for each循環永遠不會中斷,並且沒有什麼可以打破angular.forEach。原生for循環比angular.forEach快90%左右。因此,當您想要在條件匹配時斷開時,最好使用native for循環。謝謝 –

+5

@AndyJoslin這不是一個有效的JavaScript代碼。 –

6

據我所知,Angular不提供這樣的功能。您可能需要使用下劃線的find()函數(它基本上是一個forEach,一旦函數返回true,它就會跳出循環)。

http://underscorejs.org/#find

+0

這可能會橫向解決問題,但它並沒有打破循環。 –

+0

或原生循環 – shanti

265

angular.forEach循環無法在條件匹配時斷開。

我的個人建議是使用NATIVE爲循環而不是angular.forEach

NATIVE FOR循環大約爲90%比其他for循環更快。

For loop break , for loop test result

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

@本,對不起本,這是我的錯誤,但現在我經過長時間的研究後更新了我的答案。我希望這能幫到您 。謝謝 –

+0

這個測試是依賴於平臺的。在我的情況下,Native FOR慢了90%。 – LGama

17

使用一些方法

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

存在將返回true數組,你可以使用這個作爲一個變量你的功能

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

Array Some Method - Javascript

+4

對我來說,使用'angular.forEach()'的唯一原因是我必須支持IE8,它沒有'Array.forEach()'...或'Array.some()' 。 –

+2

您可以輕鬆地填充Array.forEach。見頁面底部:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/forEach – zumalifeguard

5

如果與AngularJS結合使用jQuery(因此不jqLit​​e),你可以用$。每次迭代 - 它允許突破,並繼續基於布爾返回值表達式。

的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也不錯,無論是本地Array.someArray.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 
-2

只需加$指數並執行以下操作:

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

OP想擺脫循環。 –

21

請使用的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/

+1

這應該是被接受的答案。 –

+0

no @AngelS。莫雷諾,每個人都喜歡使用本地變量,而不是專門爲手中的情況設計的方法 –

7

具體而言,您可以退出forEach循環,並在任何地方拋出異常。

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

但是,它是更好,如果你使用其他庫或實現自己的功能,在這種情況下find功能,讓你的代碼是最高層。

+7

嗯,你確實回答了這個問題!我希望沒有人那樣做:) –

+0

不必要地拋出異常不是處理這種情況的好方法。而是檢查由@ dnc253提供的解決方案http://stackoverflow.com/a/13844508/698127 – Aamol

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

     }  
    }); 
}); 
2

由於其他答案狀態,Angular不提供此功能。然而jQuery不會的,如果你已加載的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解決方案,正確的答案是否:) –

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

這個答案似乎並不完整。請指出是否需要定義「break()」或者它是否已經是角度的一部分。請定義如果不是。 – geoidesic

2

正常情況下沒有辦法突破在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

您可以使用此:

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

我寧願用回做到這一點。將循環部分放在私有函數中,並在您想要中斷循環時返回。

1

這個例子有效。嘗試一下。

var array = [0,1,2]; 
for(var i = 0, ii = array.length; i < ii; i++){ 
    if(i === 1){ 
    break; 
    } 
} 
+1

我想他不想要'for'循環,他的用例需要'foreach'而不是'for' –

0

我意識到這是舊的,但一個濾鏡陣列可以做你的需要:

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

然後,您可以運行arr.forEach等陣列功能。

我意識到,如果你打算完全減少循環操作,這可能不會做你想要的。爲此,你最好使用while

1

試試這個休息;

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