我有一个JS对象数组,我想在其上进行一些验证检查。它应该按照给定的顺序进行以下检查。
根据这些检查,所有无效对象都应该使用正确的消息添加一个msg属性。我为此创建了这个功能。但是,这似乎不是一个好的解决方案。我循环遍历数组两次以获得正确的消息。有好办法吗?
请注意,它应与IE8兼容。像每一个数组方法都行不通。
请参阅JSFiddle
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);
感谢您的帮助
答案 0 :(得分:1)
由于您的操作依赖于扫描所有项目,并且需要根据最终结果更新扫描项目,因此无法在一个循环中执行此操作,您最好的选择是保存有效项目的引用,然后循环如果选择了多个项目,则覆盖它们。
最佳案例场景:您只有1个有效值(您不会再次循环数组)。
最坏情况:数组中的所有项都有效(您将循环有效值数组,与再次循环同一数组相同)。
<强>更新强>
我再次阅读你的帖子,我得到的是:
如果以上情况属实,那么您必须在扫描项目后重新访问:
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';
}
}
最佳案例:[{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
}
关键不在于混淆消息传递和数据结构。只有当多个元素或零元素设置为“有效”时,您的数组对象才有效。因此,您应该将消息粘贴到数组对象而不是单个项目。