Javascript 检查json中的所有字段是否都已设置且非空
我有一个类似这样的jsonJavascript 检查json中的所有字段是否都已设置且非空,javascript,node.js,json,Javascript,Node.js,Json,我有一个类似这样的json { “序列号”:“34AS9831”, “传感器类型”:“Foo”, “注册价值”:{ “值类型”:“温度”, “价值”:34.6, “测量单位”:“摄氏度” }, “注册价值”:“2021年8月24日14:05:34” } 我需要检查是否所有字段都已设置,并且它们必须为非空 第一种解决方案如下: 试试看{ 检查请求(req、res); 让data=JSON.parse(req.body); 让isjsonbad格式化= data.serial==未定义|| dat
{
“序列号”:“34AS9831”,
“传感器类型”:“Foo”,
“注册价值”:{
“值类型”:“温度”,
“价值”:34.6,
“测量单位”:“摄氏度”
},
“注册价值”:“2021年8月24日14:05:34”
}
我需要检查是否所有字段都已设置,并且它们必须为非空
第一种解决方案如下:
试试看{
检查请求(req、res);
让data=JSON.parse(req.body);
让isjsonbad格式化=
data.serial==未定义||
data.serial==null||
data.sensor_type==未定义||
data.sensor_type==null||
data.value_registed==未定义||
data.value_registed==null||
data.value\u registed.value\u type==未定义||
data.value\u registed.value\u type==null||
data.value\u registed.value==未定义||
data.value\u registed.value==null||
data.value\u registered.unit\u of\u measure==未定义||
data.value\u registered.unit\u of\u measure==null||
data.value\u registered\u at==未定义||
data.value_registered_at==null;
if(isjsonbad格式){
不可处理的json(res);
警惕();
返回;
}
insertDataIntoDB(数据);
}捕捉(错误){
/*TODO:实现警报功能*/
警惕();
}
但我不喜欢这样。有没有更优雅的方法来编写它?您可以尝试以下功能:
const validate=(对象,验证)=>
validations.every(key=>![undefined,null]。包括(key.split('..')。reduce((acc,cur)=>acc?[cur],obj));
只需要提供一个数组,其中包含不应为空的每个属性名
const validate=(对象,验证)=>
validations.every(key=>![undefined,null]。包括(key.split('..')。reduce((acc,cur)=>acc?[cur],obj));
常数数据={
“序列号”:“34AS9831”,
“传感器类型”:“Foo”,
“注册价值”:{
“值类型”:“温度”,
“价值”:34.6,
“测量单位”:“摄氏度”
},
“注册价值”:“2021年8月24日14:05:34”
};
常量验证=[
"连载",,
“传感器类型”,
“已注册的价值”,
“值\u已注册。值\u类型”,
“值\注册的值”,
“注册值。度量单位”,
“注册的价值”
];
日志(验证(数据、验证))代码>使用递归的解决方案
设计字段的布局
- 按以下方式创建包含所有所需属性的
字段
数组:
- 对于直接位于对象上的属性,请将其作为字符串提供
- 对于嵌套属性,请提供一个数组,其中第一个元素是直接键,第二个元素是嵌套在其中的所有键
递归函数的工作原理
- 循环遍历字段数组中的所有值。
- 如果值为NOT一个
数组
,并且在对象内部为NOT,则返回false
- 如果是
数组
- 检查数组的第一个元素(字符串)是否存在于对象中,如果NOT返回
false
- 如果上述条件通过,则使用正确的对象和数组的第二个元素(即数组本身)调用
checkFields
。如果checkFields
失败,则返回false
注意:我增加了嵌套,在值中增加了两个字段
const obj={
序列号:“34AS9831”,
传感器类型:“Foo”,
注册的价值单位:{
值类型:“温度”,
值:{record1:35,record2:67},
测量单位:“摄氏度”,
},
价值登记日期:“24/08/2021 14:05:34”,
};
常量字段=[
“连载”,
“传感器类型”,
[
“已注册的价值”,
[“值类型”、[“值”、[“记录1”、“记录2”]、“度量单位”],
],
“注册的价值”,
];
常量检查字段=(对象,字段)=>{
for(让字段中的字段){
如果(!Array.isArray(字段)){
如果(obj?[field]==未定义)返回false;
}else如果(!obj?[field[0]]| |!checkField(obj[field[0]],field[1]))
返回false;
}
返回true;
};
日志(checkField(obj,fields))代码> > nulLable,您可以考虑查看这个解决方案,如果您有深嵌套对象,它应该工作得更好。BTW,我提供的解决方案也支持深嵌套对象:p@HaoWu是绝对+1。但是您必须为属性提供完整的链,例如value\u registed.value.something.something