根据时段修改对象属性失效?玩家出勤日志故障排查与修复
Hey,我帮你拆解下这段代码里的核心问题,以及对应的修复思路:
问题分析
你的代码目前有几个关键逻辑漏洞,导致时段判断完全失效:
第二个条件块直接覆盖了第一个的结果
你先根据hour判断并设置attendance[i]._online,但紧接着又用second的条件重新赋值——不管第一个判断得到的结果是true还是false,都会被第二个条件的结果完全覆盖。这就导致小时段的判断逻辑相当于被跳过了,最终_online只由秒数的范围决定。玩家在线状态的判断逻辑错误
代码里的if(player1 && player2 && player3 && player4)是直接判断玩家对象是否存在(只要对象不是null/undefined,这个条件就永远为true),而不是判断他们的实际在线状态。更关键的是:循环遍历的是attendance数组(每个元素对应单个玩家的出勤记录),但你却用“四个玩家都在线”的统一条件去设置所有出勤条目,这会导致所有玩家的出勤状态完全一致,和单个玩家的实际情况脱节。error变量的逻辑模糊且不合理if(error)的判断没有明确的上下文——如果error是错误状态标识,那“有错误时标记在线”的逻辑和出勤日志的需求完全不符,大概率是测试代码遗留的无效逻辑。
修复方案
假设你的需求是:每个出勤条目对应单个玩家,在10:00-20:00时段内,玩家在线则出勤记录为true;其他时段为false;如果是测试场景,可结合秒数临时调整状态,修复后的代码如下:
// 先把玩家对象整理成数组,和出勤数组一一对应 const players = [player1, player2, player3, player4]; const today = new Date(); const hour = today.getHours(); const second = today.getSeconds(); // 假设error是测试用的标记,明确它的含义 const error = false; // 根据实际场景赋值 for (let i = 0; i < attendance.length; i++) { const currentPlayer = players[i]; // 1. 先根据时段设置基础在线状态 let isOnline = hour > 10 && hour < 20; // 2. 如果需要结合玩家自身的在线状态(比如玩家有自己的在线属性) if (currentPlayer) { isOnline = isOnline && currentPlayer._online; } // 3. 测试用的秒数逻辑(如果不需要可以直接删除) // 这里假设测试场景:当error为true且秒数在20-40之间时,强制标记为在线 if (error && second > 20 && second < 40) { isOnline = true; } // 4. 最终赋值给出勤记录 attendance[i]._online = isOnline; }
关键修复点说明:
- 避免结果覆盖:用临时变量
isOnline先存储基础状态,再根据其他条件调整,最后统一赋值,不会出现后序条件覆盖前序结果的问题。 - 绑定单个玩家与出勤记录:通过
players[i]获取当前循环对应的玩家,确保每个出勤条目对应单个玩家的状态,而不是所有玩家共用同一条件。 - 明确玩家状态判断:如果玩家自身有在线属性,就通过
currentPlayer._online来判断,而不是直接判断对象是否存在。 - 清理模糊逻辑:明确
error变量的作用,把测试用的秒数逻辑和业务逻辑区分开,不需要时可以直接删除。
内容的提问来源于stack exchange,提问作者Paine8887
相关产品推荐
相关产品推荐

