Javascript 检查json中的所有字段是否都已设置且非空

Javascript 检查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

我有一个类似这样的json

{
“序列号”:“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