【问题标题】:Angular JS break ForEachAngular JS 打破 ForEach
【发布时间】:2016-03-13 03:55:01
【问题描述】:

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

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

我怎样才能得到这个?

【问题讨论】:

  • 我不明白您为什么不只是找到值而不是进入循环。也许你给出的例子并没有讲述整个故事,但我宁愿按照@Aman 下面所说的去做。为什么要像下面提到的那样进入循环并在每次 some() 以更优雅的方式执行此操作时运行检查。请记住,如果您将 javascript 视为一种函数式语言,那么使用这些 for/while/break 类型的控制结构应该没有意义。这就是存在 foreach、find、some 等的原因

标签: angularjs javascript-framework


【解决方案1】:

据我所知,Angular 不提供这样的功能。您可能需要为此使用下划线的 find() 函数(它基本上是一个 forEach,一旦函数返回 true,就会跳出循环)。

http://underscorejs.org/#find

【讨论】:

  • 这可能会横向解决问题,但实际上并没有打破循环。
  • 或原生for循环
【解决方案2】:

没有办法做到这一点。见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;
    }
  }
});

【讨论】:

  • 我宁愿只在函数顶部添加一个!keepGoing && return;,更少的代码。
  • 这不是最佳实践,这里 angular forEach 循环永远不会中断,并且没有什么可以打破 angular.forEach 。原生 for 循环比 angular.forEach 快 90% 左右。因此,当您想在条件匹配时中断时,最好使用本机 for 循环。谢谢
  • xcatly 我卡住了...这有帮助..非常感谢...无论如何我想知道使 forEach 循环牢不可破的原因。如果有的话
  • 这不应该是公认的答案,因为它不会破坏 forEach 循环。这只是一种不在循环内执行所有逻辑的方法。
【解决方案3】:

angular.forEach 循环不能在条件匹配时中断。

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

NATIVE FOR 循环比其他 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.');
}

【讨论】:

  • 这对我不起作用。它所做的只是完成循环的这个特定迭代。但随后它会继续进行下一次迭代。
  • @Ben,对不起本,这是我的错误,但现在我经过长时间的研究更新了我的答案。我希望这能帮到您 。谢谢
  • @LGama :- 你是什么情况??
  • jsperf.com/angular-foreach-performance 在您自己的浏览器上进行测试,以决定您应该选择哪个功能。我在 IE11 上测试过,它也和截图一样快。还测试了 Array.some() 但它比 IE11 上的 Array.forEach() 慢,但可能比 angular.foreach 更快;-)。或者在这里测试它jsperf.com/angular-foreach-vs-native(所有学分归原作者,不是我;-))
  • 即使使用 jsperf,您也不能说“native for 大约快 90%”。在您的场景中,这在很大程度上取决于内部函数的执行成本以及通过提前退出循环(中断)可以节省多少次执行。
【解决方案4】:

使用数组的一些方法

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

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

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

Array Some Method - Javascript

【讨论】:

【解决方案5】:

如果您将 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
    }
});

注意:

虽然使用 jQuery 还不错,但 MDN 推荐使用原生 Array.someArray.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

【讨论】:

    【解决方案6】:

    只需添加 $index 并执行以下操作:

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

    【讨论】:

    • OP 想要跳出循环。
    【解决方案7】:

    请使用 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/

    【讨论】:

    • 没有@AngelS.Moreno,每个人都更喜欢使用局部变量而不是专门为手头的情况设计的方法
    【解决方案8】:

    具体来说,你可以退出forEach循环,在任何地方都可以抛出异常。

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

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

    【讨论】:

    • 嗯,你确实回答了这个问题!我希望没有人这样做:)
    • 不必要地抛出异常并不是处理这种情况的好方法。而是查看@dnc253提供的解决方案stackoverflow.com/a/13844508/698127
    【解决方案9】:
    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)
                }
    
            }      
        });
    });
    

    【讨论】:

      【解决方案10】:

      正如其他答案所述,Angular 不提供此功能。但是 jQuery 可以,如果你已经加载了 jQuery 和 Angular,你可以使用

      jQuery.each ( array, function ( index, value) {
          if(condition) return false; // this will cause a break in the iteration
      })
      

      http://api.jquery.com/jquery.each/

      【讨论】:

      • OP 要求 AngularJS 解决方案,正确答案是 NO :)
      【解决方案11】:

      break 在 Angular 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
                        }
                      });
      

      【讨论】:

      • 这个答案似乎并不完整。请指出是否需要定义 break() 或者它是否已经是 Angular 的一部分。如果不是,请定义。
      【解决方案12】:

      通常没有办法打破 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.')
          }

      【讨论】:

        【解决方案13】:

        你可以用这个:

        var count = 0;
        var arr = [0,1,2];
        for(var i in arr){
           if(count == 1) break;
           //console.log(arr[i]);
        }
        

        【讨论】:

          【解决方案14】:
          $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;
               });
           }
          

          【讨论】:

            【解决方案15】:

            我宁愿通过返回来做到这一点。将循环部分放在私有函数中,并在您想中断循环时返回。

            【讨论】:

              【解决方案16】:

              这个例子有效。试试看。

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

              【讨论】:

              • 我猜他不想要for循环,他的用例可能需要foreach而不是for
              【解决方案17】:

              我意识到这是旧的,但数组过滤器可能会满足您的需求:

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

              然后您可以运行arr.forEach 和其他数组函数。

              我意识到,如果您打算完全减少循环操作,这可能不会达到您想要的效果。为此,您最好使用while

              【讨论】:

                【解决方案18】:

                试试这个作为休息;

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

                【讨论】:

                  【解决方案19】:

                  我会使用return 而不是break

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

                  像魅力一样工作。

                  【讨论】:

                  • 这不是一个有效的解决方案。看:function test() { angular.forEach([1,2,3,4,5,6,7,8,9], function(value, index) { if(value == 2) return; console.log (值); }) } 输出:> teste(); 1 3 4 5 6 7 8 9
                  【解决方案20】:

                  使用 Return 来打破循环。

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

                  【讨论】:

                    【解决方案21】:
                    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;
                        }
                    }
                    

                    【讨论】:

                      猜你喜欢
                      • 2022-01-02
                      • 1970-01-01
                      • 1970-01-01
                      • 1970-01-01
                      • 1970-01-01
                      • 1970-01-01
                      • 2011-12-08
                      相关资源
                      最近更新 更多