循环校验数组对象状态异常:含NOT OK行仍触发upload API求助
问题原因与修复方案
错误原因
你的代码逻辑完全不符合需求:
- 用
forEach遍历选中行时,每遇到一个status为OK的行就调用一次API,同时遇到NOT OK的行就弹提示,导致只要选中行里同时有OK和NOT OK的行,就会出现API被调用+弹窗触发的情况。 - 需求要求的是先检查所有选中行,只要有一个NOT OK就只弹提示,不调用API;只有全是OK时才调用API,你的逻辑顺序搞反了,而且是逐行处理,不是整体校验。
- 另外还有大小写问题:你的判断条件是
row.status==='OK',但示例数据里的异常状态是'Not ok',大小写不匹配会导致判断失效(不过你当前代码里弹窗触发了,说明实际数据可能是'NOT OK',但还是建议统一大小写比较避免问题)。
修复后的代码
onUpload(){ const selectedRows = this.agGrid.api.getSelectedRows(); // 检查是否存在状态不为OK的行,统一转大写避免大小写问题 const hasInvalidRow = selectedRows.some(row => row.status.toUpperCase() !== 'OK'); if (hasInvalidRow) { // 存在异常行,只弹提示 this.isTooltipUpload = true; setTimeout(() => { this.isTooltipUpload = false; }, 2000); } else { // 所有行都是OK,调用一次API(如果需要逐行调用API,就把forEach放这里) /** upload API CALL **/ // 如果需求是每个OK行都调用一次API,就用下面的forEach: // selectedRows.forEach(row => { // /** upload API CALL **/ // }); } }
关键说明
- 使用
Array.some()方法可以快速判断是否存在不符合条件的行,遍历到第一个异常行就停止,比forEach效率更高。 - 用
toUpperCase()统一转换为大写比较,避免因'Not ok'、'not ok'、'NOT OK'等大小写差异导致的判断错误。 - 先做整体校验,再决定是弹提示还是调用API,完全符合需求逻辑。
内容的提问来源于stack exchange,提问作者Danny
相关产品推荐
相关产品推荐

