【发布时间】:2016-12-01 16:18:49
【问题描述】:
我正在寻找一种好的/优雅的方法来验证 javascript 对象是否具有所需的属性,到目前为止,这就是我所拥有的:
var fields = ['name','age','address'];
var info = {
name: "John Doe",
age: "",
phone: "123-456-7890"
}
var validateFields = function(o, required_fields) {
required_fields.forEach(function(field){
if(o.hasOwnProperty(field)){
if(o[field]){
console.log(field + ": " + o[field]);
}else{
console.log(field + " exists but is empty");
}
}else{
console.log(field + " doesn't exist in object");
}
});
}
validateFields(info, fields);
有没有更高效/优雅的方式在纯 javascript 中执行此操作?
编辑:好的,我很高兴我问了,因为我完全错过了一堆可能的条件,比如零。
优雅的窗外,这是一个验证功能如何?还有其他需要我检查的情况吗?
var fields = ['name','age','address'];
var info = {
name: "John Doe",
age: 0,
address: false,
phone: "123-456-7890"
}
var validateFields = function(o, required_fields, null_valid, zero_valid, empty_valid) {
var invalid_fields = [];
required_fields.forEach(function(field){
if(field in o){
switch(o[field]){
case '':
console.log(field + " exists but is empty");
if(!empty_valid){
invalid_fields.push(o[field]);
}
break;
case undefined:
console.log(field + " exists but is undefined");
invalid_fields.push(o[field]);
break;
case null:
console.log(field + " exists but is null");
if(!null_valid){
invalid_fields.push(o[field]);
}
break;
case 0:
console.log(field + " exists and the value is 0");
if(!zero_valid){
}
invalid_fields.push(o[field]);
break;
default:
console.log(field + ": " + o[field]);
break;
}
}else{
console.log(field + " doesn't exist in object");
invalid_fields.push(o[field]);
}
});
return invalid_fields;
}
var invalid = validateFields(info, fields, true, true, false);
console.log(invalid);
if(invalid.length >0){
console.log("ERROR: Missing fields");
}else{
console.log("Fields are valid");
}
【问题讨论】:
-
你的函数看起来更像是一个调试函数,它并没有真正告诉其他函数对象是否具有所需的属性。
-
我将在完成后将控制台日志替换为返回,这只是为了快速查看结果。
-
返回
forEach除了跳到下一个迭代之外并没有什么作用。也许您正在考虑map,但它仍然没有告诉您它是否有效。 -
fields.every(field => field in info && info[field] != null);
标签: javascript validation