Angular JS打破了ForEach

Sab*_*kar 249 javascript-framework angularjs

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

angular.forEach([0,1,2], function(count){
  if(count == 1){
    break;
  }
});
Run Code Online (Sandbox Code Playgroud)

我怎么能得到这个?

Nis*_*ani 290

angular.forEach循环不能在条件匹配打破.

我个人的建议是使用NATIVE FOR循环而不是angular.forEach.

NATIVE FOR循环比其他循环快约90%.

对于循环中断,用于循环测试结果

在ANGULAR中使用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.');
}
Run Code Online (Sandbox Code Playgroud)

  • 即使使用jsperf,你也不能说"原生的速度快了约90%".在您的场景中,这在很大程度上取决于内部函数的执行成本以及通过提前退出循环(中断)可以节省多少次执行. (6认同)
  • http://jsperf.com/angular-foreach-performance在您自己的浏览器上测试它以决定您应该选择哪个功能.我已经在IE11上进行了测试,它也和截图一样快.还测试了Array.some(),但它比IE11上的Array.forEach()慢,但可能比angular.foreach ;-)更快.或者在这里测试http://jsperf.com/angular-foreach-vs-native(所有学分都归原作者,而不是我;-)) (3认同)

dnc*_*253 258

没有办法做到这一点.请参阅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;
    }
  }
});
Run Code Online (Sandbox Code Playgroud)

  • 我宁愿只添加一个`!keepGoing && return;`到函数的顶部,减去代码. (45认同)
  • 这不是最佳实践,这里angular forEach循环永不中断,并且没有什么可以打破angular.forEach.Native for循环比angular.forEach快约90%.因此,当您想要在条件匹配时中断时,最好使用native for循环.谢谢 (44认同)
  • @AndyJoslin这不是一个有效的JavaScript代码. (6认同)

Neo*_*jay 22

请使用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.
Run Code Online (Sandbox Code Playgroud)

一些例子:

var ary = ["JavaScript", "Java", "CoffeeScript", "TypeScript"];

ary.some(function (value, index, _ary) {
    console.log(index + ": " + value);
    return value === "JavaScript";
});
Run Code Online (Sandbox Code Playgroud)

每个例子:

var ary = ["JavaScript", "Java", "CoffeeScript", "TypeScript"];

ary.every(function(value, index, _ary) {
    console.log(index + ": " + value);
    return value.indexOf("Script") > -1;
});
Run Code Online (Sandbox Code Playgroud)

查找更多信息
http://www.jsnoob.com/2013/11/26/how-to-break-the-foreach/


小智 17

使用Array Some Method

 var exists = [0,1,2].some(function(count){
      return count == 1
 });
Run Code Online (Sandbox Code Playgroud)

exists将返回true,您可以将其用作函数中的变量

if(exists){
    console.log('this is true!')
}
Run Code Online (Sandbox Code Playgroud)

数组一些方法 - Javascript

  • 对我来说,使用`angular.forEach()`的唯一原因是我必须支持IE8,它没有`Array.forEach()`...或`Array.some()`. (4认同)
  • 您可以轻松地填充Array.forEach.请参阅页面底部:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/forEach (2认同)

mna*_*mna 6

据我所知,Angular没有提供这样的功能.你可能想要使用下划线的find()函数(它基本上是一个forEach,一旦函数返回true就会突破循环).

http://underscorejs.org/#find


con*_*uxe 6

如果将jQuery(因此不是jqLit​​e)与AngularJS结合使用,则可以使用$ .each进行迭代 - 这允许基于布尔返回值表达式进行断开和继续.

的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
    }
});
Run Code Online (Sandbox Code Playgroud)

注意:

虽然使用jQuery也不错,MDN推荐使用本机Array.someArray.every函数,因为您可以在native 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
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)


Vic*_*lar 6

具体来说,您可以退出forEach循环,任何地方,抛出异常.

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

但是,最好是使用其他库或实现自己的函数,find在这种情况下是一个函数,因此您的代码是最高级的.

  • 好吧,你确实回答了这个问题!我希望没有人这样做:) (10认同)

小智 5

试试这个作为休息;

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