在javascript / angular中退出嵌套的foreach(函数)循环

时间:2014-03-17 13:01:55

标签: javascript angularjs foreach

我正在尝试检查我的表单中所有需要的字段(isRequired = true)是否已满足。 我通过比较表单结构(assesmentForm)和用户响应(在$ scope上)来做到这一点。 我不想知道关于这个领域的一些细节(从VF开始),我希望它一旦找到一个未完成的领域就停止。 问题是当我在forEach循环中使用“return”时 - 而不是离开forEach它会进入下一个迭代(下一个函数)。我尝试过使用:break,continue,labeling等等 我真的需要一些帮助

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

1 个答案:

答案 0 :(得分:3)

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页面:&#34;使用三个参数调用回调:元素的值,元素的索引和遍历的Array对象&#34; - 它们在顶部的示例中命名为elementindexarray。由于您只需要数组的当前元素,因此只需在函数(function(o))中提供一个参数名称,而不是三个(function(o, index, array))。如果你需要知道你在数组中的位置,那么另外两个非常有用。