校准数据数组Pn字段完整性校验优化方案咨询
校准数据校验逻辑优化需求
数据结构
单组校准数据结构
[ { "Axis": "Profile", "P1": 12, "P2": "", "P3": "", "P4": "", "P5": "", "P6": "", "P7": "", "P8": "", "P9": "", "P10": "", "year": "" }, { "Axis": "Symmetry", "P1": 23, "P2": "", "P3": "", "P4": "", "P5": "", "P6": "", "P7": "", "P8": "", "P9": "", "P10": "", "year": "" }, { "Axis": "Error (%)", "P1": "", "P2": 1, "P3": "", "P4": "", "P5": "", "P6": "", "P7": "", "P8": "", "P9": "", "P10": "", "year": "" }, { "Axis": "Velocity (m/s)", "P1": 22, "P2": "", "P3": "", "P4": "", "P5": "", "P6": "", "P7": "", "P8": "", "P9": "", "P10": "", "year": "" } ]
完整循环用数据结构
[ { "ChartId": "1", "CalibrationData": [ { "CalibrationYear": "2012", "CalibrationData": [ { "Axis": "Profile", "P1": 12, "P2": "", "P3": "", "P4": "", "P5": "", "P6": "", "P7": "", "P8": "", "P9": "", "P10": "", "year": "" }, { "Axis": "Symmetry", "P1": 23, "P2": "", "P3": "", "P4": "", "P5": "", "P6": "", "P7": "", "P8": "", "P9": "", "P10": "", "year": "" }, { "Axis": "Error (%)", "P1": "", "P2": 1, "P3": "", "P4": "", "P5": "", "P6": "", "P7": "", "P8": "", "P9": "", "P10": "", "year": "" }, { "Axis": "Velocity (m/s)", "P1": 22, "P2": "", "P3": "", "P4": "", "P5": "", "P6": "", "P7": "", "P8": "", "P9": "", "P10": "", "year": "" } ], "CalibrationMeterName": "FT35101A", "CalibrationTags": [ "Blocks_127.ProfileFactor", "Blocks_022.AvgFlow" ], "CalibrationApiName": "USM" }, { "CalibrationYear": "3022", "CalibrationData": [ { "Axis": "Profile", "P1": 1, "P2": "", "P3": "", "P4": "", "P5": "", "P6": "", "P7": "", "P8": "", "P9": "", "P10": "", "year": "" }, { "Axis": "Symmetry", "P1": "", "P2": 1, "P3": "", "P4": "", "P5": "", "P6": "", "P7": "", "P8": "", "P9": "", "P10": "", "year": "" }, { "Axis": "Error (%)", "P1": "", "P2": "", "P3": 1, "P4": "", "P5": "", "P6": "", "P7": "", "P8": "", "P9": "", "P10": "", "year": "" }, { "Axis": "Velocity (m/s)", "P1": "", "P2": "", "P3": "", "P4": 1, "P5": "", "P6": "", "P7": "", "P8": "", "P9": "", "P10": "", "year": "" } ], "CalibrationMeterName": "FT35101A", "CalibrationTags": [ "Blocks_127.ProfileFactor", "Blocks_022.AvgFlow" ], "CalibrationApiName": "USM" } ] } ]
校验需求
- 对P1到P10每个字段组分别校验:若任意Axis的某P字段(如P1)存在有效值,则所有其他Axis的同P字段必须也有有效值
- 若存在遗漏填充的情况,触发错误提示
现有无法正常工作的逻辑代码
var isProfileDataVal = false; var isSymmetryVal = false; var isErrorVal = false; var isVelocityVal = false; for (var i = 0; i < gbl_ClibrationData.length; i++) { for (var j = 0; j < 4; j++) { if (Caldata.CalibrationData[i].CalibrationData[j].P1 != "") { if (j === 0) isProfileDataVal = true; if (j === 1) isSymmetryVal = true; if (j === 2) isErrorVal = true; if (j === 3) isVelocityVal = true; } if (Caldata.CalibrationData[i].CalibrationData[j].P2 != "") { if (j === 0) isProfileDataVal = true; if (j === 1) isSymmetryVal = true; if (j === 2) isErrorVal = true; if (j === 3) isVelocityVal = true; } if (Caldata.CalibrationData[i].CalibrationData[j].P3 != "") { if (j === 0) isProfileDataVal = true; if (j === 1) isSymmetryVal = true; if (j === 2) isErrorVal = true; if (j === 3) isVelocityVal = true; } if (Caldata.CalibrationData[i].CalibrationData[j].P4 != "") { if (j === 0) isProfileDataVal = true; if (j === 1) isSymmetryVal = true; if (j === 2) isErrorVal = true; if (j === 3) isVelocityVal = true; } if (Caldata.CalibrationData[i].CalibrationData[j].P5 != "") { if (j === 0) isProfileDataVal = true; if (j === 1) isSymmetryVal = true; if (j === 2) isErrorVal = true; if (j === 3) isVelocityVal = true; } if (Caldata.CalibrationData[i].CalibrationData[j].P6 != "") { if (j === 0) isProfileDataVal = true; if (j === 1) isSymmetryVal = true; if (j === 2) isErrorVal = true; if (j === 3) isVelocityVal = true; } if (Caldata.CalibrationData[i].CalibrationData[j].P7 != "") { if (j === 0) isProfileDataVal = true; if (j === 1) isSymmetryVal = true; if (j === 2) isErrorVal = true; if (j === 3) isVelocityVal = true; } if (Caldata.CalibrationData[i].CalibrationData[j].P8 != "") { if (j === 0) isProfileDataVal = true; if (j === 1) isSymmetryVal = true; if (j === 2) isErrorVal = true; if (j === 3) isVelocityVal = true; } if (Caldata.CalibrationData[i].CalibrationData[j].P9 != "") { if (j === 0) isProfileDataVal = true; if (j === 1) isSymmetryVal = true; if (j === 2) isErrorVal = true; if (j === 3) isVelocityVal = true; } if (Caldata.CalibrationData[i].CalibrationData[j].P10 != "") { if (j === 0) isProfileDataVal = true; if (j === 1) isSymmetryVal = true; if (j === 2) isErrorVal = true; if (j === 3) isVelocityVal = true; } } } if (!isProfileDataVal || !isSymmetryVal || !isErrorVal || !isVelocityVal) { swal("Failed", "Please add calibration period data for Profile,Symmetry,Error,Velocity!", "error"); return; }
解决方案
问题分析
现有逻辑的核心问题:
- 混淆校验维度:需求是按P字段组(如P1、P2...)校验,而现有代码仅标记Axis是否有任意值,无法关联同P字段的完整性
- 变量逻辑不匹配:
isProfileDataVal等变量仅记录Axis是否存在值,未对应到具体P字段组的校验规则 - 代码冗余:重复判断P1到P10,未复用逻辑
优化实现方案(用数组方法简化逻辑)
// 定义需要校验的P字段列表 const pFields = Array.from({length:10}, (_,i) => `P${i+1}`); // 定义必须校验的Axis名称 const requiredAxes = ["Profile", "Symmetry", "Error (%)", "Velocity (m/s)"]; // 遍历所有图表的校准数据 for (const chart of gbl_ClibrationData) { for (const yearCalData of chart.CalibrationData) { // 将Axis数据转为Map,方便快速查找 const axisDataMap = new Map(yearCalData.CalibrationData.map(item => [item.Axis, item])); // 逐个校验每个P字段组 for (const pField of pFields) { // 收集当前P字段下所有Axis的有效值状态 const hasValueList = requiredAxes.map(axis => { const value = axisDataMap.get(axis)[pField]; return value !== "" && value != null; // 过滤空字符串和无效值 }); // 判断:存在有效值但并非全部Axis都有值 const hasAnyValid = hasValueList.some(val => val); const allValid = hasValueList.every(val => val); if (hasAnyValid && !allValid) { // 定位缺失数据的Axis const missingAxes = requiredAxes.filter((axis, idx) => !hasValueList[idx]); swal("Failed", `${pField}字段缺失数据:${missingAxes.join(', ')}`, "error"); return; } } } }
代码说明
- 维度精准对齐:按P字段组逐个校验,确保同组内所有Axis的字段要么都有值,要么都为空
- 数据结构优化:用
Map存储Axis数据,避免多次遍历查找,提升效率 - 逻辑清晰简洁:通过
some和every快速判断字段组完整性,精准定位缺失项 - 可维护性强:新增P字段或Axis只需修改
pFields和requiredAxes数组,无需改动校验逻辑
内容的提问来源于stack exchange,提问作者Abhinav
相关产品推荐
相关产品推荐

