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