Angularjs 角断裂ForEach
我有一个角度foreach循环,如果我匹配一个值,我想从循环中断开。以下代码不起作用Angularjs 角断裂ForEach,angularjs,javascript-framework,Angularjs,Javascript Framework,我有一个角度foreach循环,如果我匹配一个值,我想从循环中断开。以下代码不起作用 angular.forEach([0,1,2], function(count){ if(count == 1){ break; } }); 我怎么能得到这个 据我所知,Angular不提供这样的功能。为此,您可能需要使用下划线的find()函数(它基本上是一个forEach函数,一旦函数返回true,它就会中断循环) 这是没有办法的。看见根据您正在做的事情,您可以使用布尔值来避免进入循环体。
angular.forEach([0,1,2], function(count){
if(count == 1){
break;
}
});
我怎么能得到这个 据我所知,Angular不提供这样的功能。为此,您可能需要使用下划线的
find()
函数(它基本上是一个forEach函数,一旦函数返回true,它就会中断循环)
这是没有办法的。看见根据您正在做的事情,您可以使用布尔值来避免进入循环体。比如:
var keepGoing = true;
angular.forEach([0,1,2], function(count){
if(keepGoing) {
if(count == 1){
keepGoing = false;
}
}
});
angular.forEach
循环不能在条件匹配时中断
我个人的建议是使用原生FOR循环,而不是angular.forEach
原生FOR循环比其他FOR循环快约90%
用于角度循环:
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数字=[0,1,2,3,4,5];
对于(变量i=0,len=numbers.length;i
使用数组的某些方法
var exists = [0,1,2].some(function(count){
return count == 1
});
exists将返回true,您可以将其用作函数中的变量
if(exists){
console.log('this is true!')
}
如果将jQuery(因此不是jqLite)与AngularJS结合使用,则可以使用$.each进行迭代-这允许基于布尔返回值表达式中断和继续
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
}
});
注意:
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.');
}
虽然使用jQuery并不坏,但MDN推荐使用本机或函数,您可以在本机文档中阅读:
“无法停止或中断forEach循环。解决方案是使用Array.every或Array.some”
MDN提供了以下示例:
一些:
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
只需添加$index并执行以下操作:
angular.forEach([0,1,2], function(count, $index) {
if($index !== 1) {
// do stuff
}
}
请使用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;
});
查找更多信息具体来说,您可以退出
forEach
循环,并在任何位置抛出异常
try {
angular.forEach([1,2,3], function(num) {
if (num === 2) throw Error();
});
} catch(e) {
// anything
}
但是,如果您使用其他库或实现您自己的函数(在本例中为
查找
函数)会更好,因此您的代码是最高级的。由于其他答案状态,Angular不提供此功能。但是,jQuery确实如此,如果您已经加载了jQuery和Angular,那么可以使用
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)
}
}
});
});
jQuery.each ( array, function ( index, value) {
if(condition) return false; // this will cause a break in the iteration
})
请参见break
在angular forEach中不可能实现,我们需要修改forEach来实现这一点
通常情况下,在javascript中无法中断“each”循环。 通常可以做的是使用“短路”方法
array.forEach(函数(项){
//如果不满足条件,则继续下一轮迭代。
如果(!条件)返回;
//如果条件满足,请在此处执行您的逻辑
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={}
对于(变量i=0;i<$scope.arr.length;i++){
如果($scope.arr[i]==1){
$scope.exists='是,1存在';
打破
}
}
如果($scope.exists){
angular.forEach($scope.arr,函数(值,索引){
$scope.dict[index]=值;
});
}
我更喜欢通过返回来实现这一点。将循环部分放在私有函数中,并在需要中断循环时返回。此示例有效。请尝试
var array = [0,1,2];
for( var i = 0, ii = array.length; i < ii; i++){
if(i === 1){
break;
}
}
var数组=[0,1,2];
for(变量i=0,ii=array.length;i
我意识到这很旧,但阵列过滤器可以满足您的需要:
var arr = [0, 1, 2].filter(function (count) {
return count < 1;
});
var arr=[0,1,2]。过滤器(函数(计数){
返回计数<1;
});
然后可以运行arr.forEach
和其他数组函数
我意识到,如果你打算完全减少循环操作,这可能不会达到你想要的效果
angular.forEach([0,1,2], function(count){
if(count == 1){
return true;
}
});
我将使用
return
而不是break
angular.forEach([0,1,2], function(count){
if(count == 1){
return;
}
});
工作起来像个符咒。使用Return来打破循环
angular.forEach([0,1,2], function(count){
if(count == 1) {
return;
}
});
我宁愿只在函数顶部添加一个
!keepGoing&&return;
,代码更少。这不是最佳做法,这里angular forEach循环永远不会中断,没有什么可以中断angular.forEach。Native for循环比angular.forEach快90%左右。因此,当您想要在条件下中断时,最好使用Native for循环match.ThankskCatly我卡住的地方…这很有帮助…非常感谢…无论如何,我想知道使forEach循环不可破解的原因。如果这不是公认的答案,因为它不会破坏forEach循环。这只是一种不执行循环内所有逻辑的方法。我不明白为什么你不在可能你给出的例子并没有说明整个故事,但我宁愿照@Aman下面说的去做。为什么要像下面提到的那样进入循环,并在每次有人()要记住,如果你把javascript当作一种函数式语言,那么使用这些for/while/break类型的控制结构是没有意义的。这就是为什么foreach、find、some等存在。这对我来说不起作用。它所做的只是完成循环的这个特定迭代。但接下来它会转到e下一次迭代。@Ben,对不起,Ben,这是我的错误,但经过长时间的研究,现在我更新了我的答案。我希望这将对您有所帮助。谢谢you@LGama:-你的情况是什么??在你自己的浏览器上测试它,决定你应该选择哪个功能。我在IE11上测试过,速度也和截图一样快。还测试了数组。some()但它比IE11上的Array.forEach()慢,但可能比angular.forEach;-)快。或者在这里测试它(所有学分都归原作者,而不是我;-))即使使用jsperf,也不能说“native for大约快90%”。在您的场景中,这在很大程度上取决于
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;
}
}