【问题标题】:Exiting a nested foreach (function) loops in javascript/angular在javascript/angular中退出嵌套的foreach(函数)循环
【发布时间】:2014-03-17 13:01:55
【问题描述】:

我正在尝试检查我的表单中需要的所有字段 (isRequired=true) 是否都已完成。 我通过将表单结构(assesmentForm)与用户响应(在 $scope 上)进行比较来做到这一点。 我不想知道有关该字段的一些详细信息(从 VF 开始),并且我希望它在找到未完成的字段后停止。 问题是当我在 forEach 循环中使用“return”时 - 而不是离开 forEach 它进入下一次迭代(下一个函数)。我尝试使用:中断、继续、标记等 我真的需要帮助

function checkFieldsValidation () {
        var VFflag =true; //Validation Failed Flag - true: not failed, False - failed
            assessmentForm.Objectives.forEach(function(o){
            if (VFflag){
            o.component.Fields.forEach(function(f){
                if (VFflag){
                    if (f.IsRequired ){
                            for (var i in $scope.responses )
                            {
                                    if( $scope.responses[i].objectives[o.relationship.ActivityRelationshipID][f.FieldID].value.length>0){ 
                                    VFflag=VFflag;
                                    }
                                    else
                                    {
                                    var VFparIndex=i;
                                    var VFActivityRelationshipID=o.relationship.ActivityRelationshipID;
                                    var VFFieldID = f.FieldID;
                                    VFflag=false;
                                    return;
                                    }
                            }
                    }
                }
                else {return;}
                }
                )
            } else {return;}
            }
            )
        return [VFflag,VFparIndex,VFActivityRelationshipID,VFFieldID];
        }

【问题讨论】:

  • 在 forEach 中,如果您返回除 'false' 以外的任何内容,它会继续循环,直到找不到确实返回 false 的对象。所以你需要返回false来打破循环
  • 嗨隆博施。我试图返回 VFflag (这是错误的),它仍然停留在 foreach 循环中,所以我想这不是答案。感谢任何方式

标签: javascript angularjs foreach


【解决方案1】:

TLDR:使用.every 而不是.forEach

来自the MDN page on forEach

注意:没有办法停止或中断 forEach 循环。解决方案 是使用 Array.every 或 Array.some。

如果您使用.every 而不是.forEach,您将能够在第一次验证失败时停止。有关更多示例,请参见该 MDN 页面,其中一个来自 .every 页面:

function isBigEnough(element, index, array) {
  return (element >= 10);
}
var passed = [12, 5, 8, 130, 44].every(isBigEnough);


--- 编辑:如何与对象一起使用 --

在评论中,您询问了如何对对象执行此操作,就像您在示例中对 of 所做的那样。

目前您正在定义匿名函数

function(o){ .... }

在循环中使用。这意味着forEach 调用正在接收该函数,并且对于数组中的每一项,它都会以当前数组项作为参数调用该函数。

在上面的例子中,同样的情况正在发生;让我们做的更简单:

var numbers = [12, 5, 8, 130, 44];
var allValid = numbers.every(function(num) { return (num > 10) });

这次我们使用匿名函数。 .every 的 MDN 页面声明:“使用三个参数调用回调:元素的值、元素的索引和被遍历的 Array 对象”——它们被命名为 elementindex 和 @987654336 @ 在顶部的示例中。由于您只需要数组的当前元素,因此只需在函数中提供一个参数名称 (function(o)) 而不是三个 (function(o, index, array))。如果您需要知道您在数组中的位置,其他两个结果非常有用。

【讨论】:

  • 嗨Phil,感谢您的帮助-我需要使用对象(第一个是o,第二个是f)-我如何在.every中做到这一点?我试图弄清楚并没有找到一个好的答案。谢谢!
  • @GiladLivnat:我已经修改了详细的答案。本质上,你现在有一个匿名函数(function(o) { ... } 没有名字),你可以继续这样做。
  • @GiladLivnat:仅供参考,请为好的答案投票,以便他们排在首位!这个答案将保持在顶部,因为您已经接受了它,但总的来说,这是一个好习惯。很高兴能提供帮助,学到了关于 .ever 的新知识!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-02-07
  • 1970-01-01
  • 2019-04-19
  • 1970-01-01
  • 1970-01-01
  • 2012-05-16
相关资源
最近更新 更多