Javascript 如何在不循环两次的情况下对数组执行两次验证检查

Javascript 如何在不循环两次的情况下对数组执行两次验证检查,javascript,Javascript,我有一个JS对象数组,我想对其进行一些验证检查。它应该按照给定的优先级进行以下检查 检查值是否正确。(obj.value==“有效”) 只有一个对象应该有值。其他的应该是空的 所有对象的值为空也是无效选项 基于这些检查,所有无效对象都应该有一个msg属性,并使用正确的消息添加到该属性中。我已经为此创建了函数。然而,这似乎不是一个好的解决方案。我在数组中循环两次以获得正确的消息。有好办法吗 请注意,它应该与IE8兼容。像each这样的数组方法不起作用 请看JSFIDLE var-arr=[{ 值

我有一个JS对象数组,我想对其进行一些验证检查。它应该按照给定的优先级进行以下检查

  • 检查值是否正确。(obj.value==“有效”)
  • 只有一个对象应该有值。其他的应该是空的
  • 所有对象的值为空也是无效选项 基于这些检查,所有无效对象都应该有一个msg属性,并使用正确的消息添加到该属性中。我已经为此创建了函数。然而,这似乎不是一个好的解决方案。我在数组中循环两次以获得正确的消息。有好办法吗

    请注意,它应该与IE8兼容。像each这样的数组方法不起作用

    请看JSFIDLE

    var-arr=[{
    值:“有效”
    }, {
    值:“”
    }, {
    值:“someinvalid value”
    }];
    函数验证(){
    变量计数器=0,
    多个ItemSelected=false,
    noItemSelected=true;
    对于(变量i=0;i0){
    if(arr[i].value!=“有效”){
    arr[i].isValid=false;
    arr[i].msg='这是一个无效值';
    }
    计数器++;
    noItemSelected=false;
    }
    如果(!arr[i].msg){
    arr[i].isValid=true;
    }
    }
    如果(计数器>1){
    多个ItemSelected=true;
    }
    如果(已选定){
    对于(变量k=0;k0){
    currItem.isValid=false;
    currItem.msg='仅添加一项';
    }
    }
    }
    }
    验证();
    控制台日志(arr);
    

    感谢您的帮助

    因为您有一个操作依赖于扫描所有项目,并且需要根据最终结果更新扫描的项目,所以无法在一个循环中完成此操作,您最好的选择是保存有效项目的引用,然后在选择多个项目时循环它们

    最佳方案:您只有1个有效值(不会再次循环数组)

    最坏情况:数组中的所有项都有效(您将循环有效值数组,与再次循环相同数组相同)

    更新

    我下次再看你的帖子,我得到的是:

  • 有效
    • 只有一个项的值=='valid',其他项应为空
  • 无效
    • 都是空的
    • 多个非空项有效或无效
  • 如果上述情况属实,那么您一定要在扫描项目后重新访问:

    function validate(arr){
        var firstValidItem = null;
        var containsInvalid = false;
        var mightRevisit = [];    
        for(var x=0;x<arr.length;x++){
            var item = arr[x];
            switch(item.value){
                case 'valid':
                    // only one valid item is allowed.
                    if(firstValidItem){                    
                        item.msg = 'add only one item';
                        item.isValid = false;
                    }else{
                        firstValidItem = item;
                        item.isValid = true;
                    }
                    break;
                case '':
                    //empty is considered valid at this point
                    item.isValid = true;
                    mightRevisit.push(item);
                    break;
                default:
                    //this is invalid regardless of others
                    item.isValid = false;
                    item.msg = 'This is an invalid value';
                    containsInvalid = true;
                    break;
            }            
        }
        //if no valid item found, all empty items should become invalid
        if(!firstValidItem){
          for(var x=0;x<mightRevisit.length;x++){
            mightRevisit[x].isValid = false;
            mightRevisit[x].msg = 'Need to set atleast one item'; 
          }
        }else if(containsInvalid){ 
            //any invalid items makes the valid item invalid.
            firstValidItem.isValid = false;
            firstValidItem.msg = 'add only one item';
        }
    }
    
    功能验证(arr){
    var firstValidItem=null;
    var containsInvalid=false;
    var MightRetain=[];
    对于(var x=0;x

    最佳情况场景
    [{value:'valid'},{value:'},{value:''},{value:''}];
    您不会循环
    可能重新访问
    数组


    最坏情况下的场景
    [{value:''},{value:'},{value:''},{value:'}]
    您将循环
    可以重新访问
    数组,该数组等于原始数组的第二个循环。

    我将使用以下结构:

    arr_obj = {
      is_valid: true,
      msg: "Bingo you got a valid stuff",
      arr:[ ... your array ]
    }
    
    而不是我会通过arr_obj.arr循环

    for (var i = 0; i < arr_obj.arr.length; i++) {
      // your validation logic
      // if found anything invalid than set arr_obj.is_valid = false and msg as well
    }
    
    for(变量i=0;i

    关键是没有混淆消息和数据结构。只有当多个或零个元素被设置为“有效”时,数组对象才无效。因此,您应该将消息粘贴到数组对象,而不是单个项目。

    什么定义了项目选择?
    noItemSelected==false
    仅当存在无效项目时!我看不到循环多次以实现目标的原因it@MK.如果数组中的所有对象都没有值,则noItemSelected变为true。(值属性)@lombausch:u是说,不要循环多次?我只是在检查是否有更好的方法来执行此操作。@Jintopy您应该将消息逻辑和数据逻辑分开。“只添加一项”消息与对象无关,但与所有对象相关,因此您应该将其保存在其他位置。这样,如果您发现第二个值设置为“valid”Hm,则无需多次循环该消息。当只有一个项具有该值,而其他所有项值为空时,数组中的所有项都是有效的。应该始终只有y一个有效值。但是,无效值可以大于1。obj1-有效值,obj2-空,obj3-空(有效方案),obj1-有效值,obj2-有效值,obj3-有效值(无效方案)是的,完全正确!您的逻辑是,如果多个项的值=='valid',则所有与相同条件匹配的有效-1项都将被视为无效..正确吗?假设obj1具有有效值。但是,obj2、obj3可以具有有效值或无效值,对吗?因此,取决于此,obj1可能会变得无效。希望我没有把您弄糊涂:-)我不喜欢在for循环中添加几个if/switch条件的想法。但是,这只是个人的偏好。谢谢,我说过,没有第二个循环是无法做到的,只是写了这篇文章来阐明我的观点:)1.在这种情况下,数组对象无效或无效。数组中的每个对象只会获得有效或无效的状态。2.在3种情况下,对象可能会变为无效。如果每个对象值都为空,则该对象也无效。或者,如果该对象的值不是“有效”值,则该对象也无效
    for (var i = 0; i < arr_obj.arr.length; i++) {
      // your validation logic
      // if found anything invalid than set arr_obj.is_valid = false and msg as well
    }