如何用优雅易懂的JavaScript代码实现嵌套JSON数组的状态查询?
优化JSON状态判断代码的优雅实现方式
待搜索的JSON
{ "results": { "key1": [ { "step": "step1", "result": "pass" } , { "step": "step2", "result": "pending" } ] } , "key2": [ { "step": "step3", "result": "pass" } , { "step": "step4", "result": "pending" } ] }
需求说明
输入一个key,需针对该key返回对应状态:
- 若所有步骤的
result=pass,则返回status=pass; - 若存在任意步骤的
result=fail,则返回fail; - 若不存在fail但存在pending,则返回pending。
现有可行实现代码
let subState = "key1"; let validationResultsJson = validationReportJson["results"]; let validationKeys = Object.keys(validationResultsJson); if (validationKeys.includes(subState)) { let subStateArr = Object.values(validationResultsJson[subState]); let result = ''; for (let eachStep of subStateArr) { result += eachStep.result; } if (result.indexOf("fail") > -1) { console.log("fail"); } else if (result.indexOf("pending") > -1) { console.log("pending"); } else { console.log("pass"); } } else { console.error("subState doesn't exist"); }
更优雅易懂的实现方案
const subState = "key1"; const validationResults = validationReportJson.results; // 检查目标key是否存在 if (!validationResults.hasOwnProperty(subState)) { console.error("subState doesn't exist"); return; } const steps = validationResults[subState]; // 优先判断是否存在失败步骤(优先级最高) if (steps.some(step => step.result === "fail")) { console.log("fail"); return; } // 再判断是否存在待处理步骤 if (steps.some(step => step.result === "pending")) { console.log("pending"); return; } // 所有步骤都通过 console.log("pass");
优化亮点
- 逻辑清晰直观:严格按照需求的优先级(fail > pending > pass)依次判断,代码流程和业务规则完全对应,一眼就能看懂
- 语义化方法使用:用数组原生的
some方法替代字符串拼接查找,steps.some(step => step.result === "fail")直接表达“是否有步骤失败”,逻辑更直白 - 减少嵌套层级:每满足一个条件就直接返回,避免多层if-else嵌套,代码结构更扁平
- 变量命名简洁:简化了冗长的变量名,比如
validationResults、steps,提升可读性 - 高效的存在性检查:用
hasOwnProperty直接判断key是否存在,比先取keys再判断包含关系更高效
内容的提问来源于stack exchange,提问作者Vijay
相关产品推荐
相关产品推荐

