Javascript 通过对象验证属性?
如何通过对象验证属性?我已经在Javascript 通过对象验证属性?,javascript,node.js,Javascript,Node.js,如何通过对象验证属性?我已经在checkProperty 我希望missingFields返回Batch。缺少Name 当前正在输出['Batch.Id','Batch.Name'],这是错误的 let数据={ 批次:{ Id:123, }, 总数:100, } 让checkProperty=['Total','Batch.Id','Batch.Name']; 设missingFields=[]; checkProperty.forEach(字段=>{ 如果(!数据[字段]){ missing
checkProperty
我希望missingFields
返回Batch。缺少Name
当前正在输出['Batch.Id','Batch.Name']
,这是错误的
let数据={
批次:{
Id:123,
},
总数:100,
}
让checkProperty=['Total','Batch.Id','Batch.Name'];
设missingFields=[];
checkProperty.forEach(字段=>{
如果(!数据[字段]){
missingFields.push(字段);
}
});
控制台日志(丢失字段)代码>在点上拆分后,必须使用类似于reduce
的方法来检查嵌套值是否存在:
let数据={
批次:{
Id:123,
},
总数:100,
}
让checkProperty=['Total','Batch.Id','Batch.Name'];
设missingFields=[];
checkProperty.forEach(字段=>{
const val=field.split('.').reduce((a,prop)=>!a?null:a[prop],data);
如果(!val){
missingFields.push(字段);
}
});
控制台日志(丢失字段)代码>您可以使用此
当执行
data[Batch.Id]操作时,此
data[field]尝试在对象的第一级键进行检查的原因。在本例中,我们没有任何键,例如
Batch.Id
For our case we need `data[Batch][Id]` something like this which first searches
for `Batch` property and than or the found value it searches for `Id`.
let数据={
批次:{
Id:123,
},
总数:100,
}
让checkProperty=['Total','Batch.Id','Batch.Name'];
设missingFields=[];
checkProperty.forEach(字段=>{
让温度=字段拆分('.')。减少((o,e)=>{
返回o[e]| |数据[e]
},{});
如果(!temp){
missingFields.push(字段);
}
});
控制台日志(丢失字段)代码>如果您可以使用其他库,Ajv非常适合于此。您可以创建一个模式并验证它,而不是自己创建所有逻辑
var schema = {
"type": "object",
"properties": {
"Batch": {
"type": "object",
"required": ["Id", "Name"],
"properties":
{
"Id":{},
"Name":{},
},
},
"Total": {}
}
};
let json = {
Batch: {
Id: 123,
},
Total: 100,
}
var ajv = new Ajv({
removeAdditional: 'all',
allErrors: true
});
var validate = ajv.compile(schema);
var result = validate(json);
console.log('Result: ', result);
console.log('Errors: ', validate.errors);
返回以下错误消息:
dataPath:".Batch"
keyword:"required"
message:"should have required property 'Name'"
params:{missingProperty: "Name"}
schemaPath:"#/properties/Batch/required"
我维护一个最小的JavaScript类型检查库。它可以按照你的期望做一些事情。也许值得一看。