Angularjs 角断裂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,它就会中断循环) 这是没有办法的。看见根据您正在做的事情,您可以使用布尔值来避免进入循环体。

我有一个角度foreach循环,如果我匹配一个值,我想从循环中断开。以下代码不起作用

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