Angular JS打破ForEach
我有一个angular度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; } } });
angular.forEach
循环在条件匹配时不能中断。
我的个人build议是使用NATIVE FOR循环而不是angular.forEach
。
NATIVE FOR循环比其他循环快90%左右。
用于循环的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.'); }
请使用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/
使用数组某些方法
var exists = [0,1,2].some(function(count){ return count == 1 });
存在将返回true,您可以将其用作函数中的variables
if(exists){ console.log('this is true!') }
数组的一些方法 – Javascript
具体地说,你可以退出forEach
循环,并且在任何地方抛出exception。
try { angular.forEach([1,2,3], function(num) { if (num === 2) throw Error(); }); } catch(e) { // anything }
但是,如果使用其他库或者实现自己的函数(在这种情况下是find
函数),那么代码是最高级的。
据我所知,Angular不提供这样的function。 你可能需要使用下划线的find()
函数(它基本上是一个forEach,一旦函数返回true就跳出循环)。
如果您将jQuery(因此不是jqLite)与AngularJS结合使用,则可以使用$ .each进行迭代 – 这允许基于布尔返回值expression式进行中断和继续。
的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 } });
注意:
尽pipe使用jQuery并不差,但MDNbuild议使用本地Array.some或Array.every函数,因为您可以在本地forEach文档中阅读这些函数:
“没有办法停止或打破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
由于其他答案的状态,Angular不提供这个function。 不过,jQuery并没有,如果你已经加载jQuery以及Angular,你可以使用
jQuery.each ( array, function ( index, value) { if(condition) return false; // this will cause a break in the iteration })
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,eg an empty string } });
通常情况下,没有办法在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]); }
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) } } }); });
这个例子起作用。 尝试一下。
var array = [0,1,2]; for( var i = 0, ii = array.length; i < ii; i++){ if(i === 1){ break; } }
试试这个rest;
angular.forEach([0,1,2], function(count){ if(count == 1){ return true; } });
$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; }); }
我宁愿这样做,通过回报。 将循环部分放在私有函数中,并在要打破循环时返回。
我意识到这是旧的,但一个数组filter可能会做你所需要的:
var arr = [0, 1, 2].filter(function (count) { return count < 1; });
然后你可以运行arr.forEach
和其他数组函数。
我意识到,如果你打算完全减less循环操作,这可能不会做你想要的。 为此,你最好使用。
只需添加$ index并执行以下操作:
angular.forEach([0,1,2], function(count, $index) { if($index !== 1) { // do stuff } }
- 离子指令VS带有ionic framework的angular度材料指令
- 将parameter passing给angularjsfilter
- 延迟AngularJS路线更改,直到加载模型以防止闪烁
- 当模型元素与模型数组拼接时,AngularJS:ng-repeat列表不会更新
- Jasmine 2.0 async done()和angular-mocks inject()在同一个testing中它()
- 用ng-show和ng-animate来上下滑动效果
- Angular UI路由器中的$ state.transitionTo()和$ state.go()之间的区别
- AngularJS控制器的生命周期是什么?
- 用bower添加ui.bootstrap依赖