如何实现if条件首次匹配无响应、第二次匹配才触发对应逻辑?
实现思路
你需要额外引入状态变量记录目标条件的命中次数,首次命中时仅更新状态不执行业务逻辑,第二次命中时触发你需要的操作即可。
单条件基础实现
针对你示例中的单个x < 0判断场景,最简实现如下:
// 状态标记:记录条件是否已经命中过1次 let matchedOnce = false; const x = -1; function runCheck() { if (x < 0) { if (!matchedOnce) { // 第一次命中,仅更新标记,不执行目标操作 matchedOnce = true; console.log("is okay"); // 对应你示例的首次输出,不需要可以直接删除 } else { // 第二次及之后命中,执行目标操作 console.log("is not okay"); } } } // 测试效果 runCheck(); // 输出:is okay runCheck(); // 输出:is not okay runCheck(); // 输出:is not okay
如果要求仅第二次命中时执行一次,之后再命中都不执行,调整状态判断逻辑即可:
let matchedOnce = false; let hasTriggeredAction = false; const x = -1; function runCheck() { if (x < 0) { if (!matchedOnce) { matchedOnce = true; console.log("is okay"); } else if (!hasTriggeredAction) { hasTriggeredAction = true; console.log("is not okay"); } } } // 测试效果 runCheck(); // 输出:is okay runCheck(); // 输出:is not okay runCheck(); // 无输出
多条件独立统计实现
如果需要同时支持多个不同条件分别统计命中次数,互不影响,可以用Map存储每个条件的命中状态:
// 存储所有条件的命中次数 const conditionMatchCount = new Map(); /** * 条件检查工具函数 * @param {string} key 条件唯一标识,用来区分不同的判断条件 * @param {boolean} condition 判断条件的布尔结果 * @param {Function} onFirstMatch 第一次命中时的回调 * @param {Function} onRepeatMatch 第二次及之后命中时的回调 */ function checkCondition(key, condition, onFirstMatch, onRepeatMatch) { if (!condition) return; const count = conditionMatchCount.get(key) ?? 0; if (count === 0) { onFirstMatch?.(); conditionMatchCount.set(key, 1); } else { onRepeatMatch?.(); conditionMatchCount.set(key, count + 1); } } // 测试使用 const x = -1; const y = 5; // 检查x<0的条件 checkCondition( 'x_less_than_0', x < 0, () => console.log('x第一次小于0'), () => console.log('x再次小于0') ); // 输出:x第一次小于0 checkCondition( 'x_less_than_0', x < 0, () => console.log('x第一次小于0'), () => console.log('x再次小于0') ); // 输出:x再次小于0 // 检查y>3的条件,和上述条件统计完全独立 checkCondition( 'y_greater_than_3', y > 3, () => console.log('y第一次大于3'), () => console.log('y再次大于3') ); // 输出:y第一次大于3
内容的提问来源于stack exchange,提问作者Yusup
相关产品推荐
相关产品推荐

