如何在数组上进行两次验证检查而不循环两次

时间:2014-04-14 09:46:08

标签: javascript

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

  1. 检查值是否正确。 (obj.value =='有效')
  2. 只有一个对象应具有价值。其他应该是空的。
  3. 所有对象的值为空也是无效选项。
  4. 根据这些检查,所有无效对象都应该使用正确的消息添加一个msg属性。我为此创建了这个功能。但是,这似乎不是一个好的解决方案。我循环遍历数组两次以获得正确的消息。有好办法吗?

    请注意,它应与IE8兼容。像每一个数组方法都行不通。

    请参阅JSFiddle

    http://jsfiddle.net/K2Y7F/

    var arr = [{
        value: 'valid'
    }, {
        value: ''
    }, {
        value: 'someinvalid value'
    }];
    
    function validate() {
        var counter = 0,
            moreThanOneItemSelected = false,
            noItemSelected = true;
        for (var i = 0; i < arr.length; i++) {
            arr[i].msg = '';
            if (arr[i].value.length > 0) {
                if (arr[i].value != 'valid') {
                    arr[i].isValid = false;
                    arr[i].msg = 'This is an invalid value';
                }
                counter++;
                noItemSelected = false;
            }
            if (!arr[i].msg) {
                arr[i].isValid = true;
            }
        }
    
        if (counter > 1) {
            moreThanOneItemSelected = true;
        }
        if (noItemSelected) {
            for (var k = 0; k < arr.length; k++) {
                arr[k].isValid = false;
                arr[i].msg = 'Need to set atleast one item';
            }
        } else {
            for (var j = 0; j < arr.length; j++) {
                var currItem = arr[j];
                /*invalid item*/
                if (currItem.isValid && moreThanOneItemSelected && currItem.value.length > 0) {
                    currItem.isValid = false;
                    currItem.msg = 'add only one item';
                }
            }
        }
    
    }
    validate();
    console.log(arr);
    

    感谢您的帮助

2 个答案:

答案 0 :(得分:1)

由于您的操作依赖于扫描所有项目,并且需要根据最终结果更新扫描项目,因此无法在一个循环中执行此操作,您最好的选择是保存有效项目的引用,然后循环如果选择了多个项目,则覆盖它们。

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

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

<强>更新

我再次阅读你的帖子,我得到的是:

  1. VALID
    • 只有一个具有值=='有效'的项目,其他项目应为空。
  2. INVALID
    • 全空。
    • 多个无空项目有效或无效。
  3. 如果以上情况属实,那么您必须在扫描项目后重新访问:

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

    http://jsfiddle.net/kzLj2/

    最佳案例[{value: 'valid'},{value: ''},{value: ''}];您不会循环mightRevisit数组。

    最糟糕的情况[{value: ''},{value:''},{value: ''}]你将循环mightRevisit数组,它等于原始数组的第二个循环。

答案 1 :(得分:0)

我会使用这种结构:

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
}

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