求助:编写签名字段的复杂动态校验逻辑
账户签名字段校验问题解决
需求说明
- 当
chequebook === "NO"且账户类型为Asaan Digital Account或Asaan Digital Remittance Account时,签名字段设为可选; - 当
chequebook === "YES"且为上述两类账户时,签名字段设为必填; - 其余所有账户类型,签名字段默认必填。
当前问题
编写的校验代码未生效,错误地将所有账户的签名字段设为可选,需要编写正确的校验逻辑。
尝试过的代码
第一段尝试代码
const files = [...attachmentType[i].attachments]; const addedFiles = []; for (var m = 0; m < files.length; m++) { const signatureOptional = (state.applicantList[0].chequebook === "NO" && account && account.get("product") === "Asaan Digital Account") || (account && account.get("product") === "Asaan Digital Remittance Account") ? files[m].value = "SIGNATURE_SCAN" : ""; console.log(signatureOptional, 'hello world'); if (files[m].files.length === 0 && files[m].value !== "OTHER" && !signatureOptional) { addedFiles.push({ primaryText: files[m].primaryText, validationResult: files[m].validationRequired, }); } }
第二段误实现代码
const files = [...attachmentType[i].attachments]; const addedFiles = []; for (var m = 0; m < files.length; m++) { if (files[m].files.length === 0 && files[m].value !== "OTHER" && files[m].value !== "SIGNATURE_SCAN") { addedFiles.push({ primaryText: files[m].primaryText, validationResult: files[m].validationRequired, }); } } let missingDocument = [...props.invalidType] missingDocument = missingDocument.filter((data) => data.primaryText !== 'Other documents (optional)' && data.primaryText !== 'Signature Scan')
正确的校验逻辑实现
首先明确核心判断条件:
- 先识别当前文件是否为签名字段(
value === "SIGNATURE_SCAN") - 再结合账户类型和chequebook状态,决定是否需要强制校验该字段
完整代码示例:
const files = [...attachmentType[i].attachments]; const addedFiles = []; // 提前提取关键状态,避免重复取值 const chequebookStatus = state.applicantList[0]?.chequebook; const accountProduct = account?.get("product"); // 统一维护符合可选签名条件的账户类型 const eligibleAccounts = [ "Asaan Digital Account", "Asaan Digital Remittance Account" ]; for (let m = 0; m < files.length; m++) { const file = files[m]; const isSignature = file.value === "SIGNATURE_SCAN"; const isEligibleAccount = eligibleAccounts.includes(accountProduct); const isSignatureOptional = chequebookStatus === "NO" && isEligibleAccount; // 校验规则: // 1. 文件为空且非OTHER类型时才需要校验 // 2. 非签名字段默认必填,直接加入错误列表 // 3. 签名字段仅当不是可选状态时,才加入错误列表 if (file.files.length === 0 && file.value !== "OTHER") { if (!isSignature || (isSignature && !isSignatureOptional)) { addedFiles.push({ primaryText: file.primaryText, validationResult: file.validationRequired, }); } } } // 仅当签名确实为可选状态时,才从缺失文档列表中移除签名项 let missingDocument = [...props.invalidType]; if (isSignatureOptional) { missingDocument = missingDocument.filter(data => data.primaryText !== 'Other documents (optional)' && data.primaryText !== 'Signature Scan' ); }
代码说明
- 提前提取
chequebookStatus和accountProduct,减少重复操作,提升代码可读性 - 用数组
eligibleAccounts统一管理目标账户类型,后续修改只需调整数组内容 - 拆分核心判断变量,让校验逻辑更清晰,便于调试和维护
- 过滤缺失文档列表时,增加前置判断,避免误移除必填的签名字段
内容的提问来源于stack exchange,提问作者Hamza Anis
相关产品推荐
相关产品推荐

