You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

校准数据数组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;
}

解决方案

问题分析

现有逻辑的核心问题:

  1. 混淆校验维度:需求是按P字段组(如P1、P2...)校验,而现有代码仅标记Axis是否有任意值,无法关联同P字段的完整性
  2. 变量逻辑不匹配:isProfileDataVal等变量仅记录Axis是否存在值,未对应到具体P字段组的校验规则
  3. 代码冗余:重复判断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;
            }
        }
    }
}

代码说明

  1. 维度精准对齐:按P字段组逐个校验,确保同组内所有Axis的字段要么都有值,要么都为空
  2. 数据结构优化:用Map存储Axis数据,避免多次遍历查找,提升效率
  3. 逻辑清晰简洁:通过some和every快速判断字段组完整性,精准定位缺失项
  4. 可维护性强:新增P字段或Axis只需修改pFields和requiredAxes数组,无需改动校验逻辑

内容的提问来源于stack exchange,提问作者Abhinav

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.18 22:52:01