如何为每个新LOGIN生成数据行,汇总READY与NOT_READY时长
解决方案
以下是修改后的代码,能够处理多轮登录会话,包括未完成(无LOGOUT)的会话:
<!DOCTYPE html> <html> <head> <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.6.0/jquery.min.js"></script> <script> $(document).ready(function(){ let displayArray = []; let currentSession = null; // 存储当前正在统计的会话数据 const localArray = [ {"state":"LOGIN","startTime":"10.25"}, {"state":"READY","startTime":"10.26","endTime":"10.35","duration":"615"}, {"state":"NOT_READY","startTime":"11:26","endTime":"10.35","duration":"874"}, {"state":"READY","startTime":"10.26","endTime":"10.35","duration":"222"}, {"state":"NOT_READY","startTime":"11:26","endTime":"10.35","duration":"111"}, {"state":"READY","startTime":"10.26","endTime":"10.35","duration":"333"}, {"state":"NOT_READY","startTime":"11:26","endTime":"10.35","duration":"888"}, {"state":"READY","startTime":"10.26","endTime":"10.35","duration":"444"}, {"state":"NOT_READY","startTime":"11:26","endTime":"10.35","duration":"999"}, {"state":"LOGOUT","startTime":"13.26"}, // 再次登录 {"state":"LOGIN","startTime":"08.58"}, {"state":"READY","startTime":"10.26","endTime":"10.35","duration":"12"}, {"state":"NOT_READY","startTime":"11:26","endTime":"10.35","duration":"13"}, {"state":"READY","startTime":"10.26","endTime":"10.35","duration":"14"}, {"state":"NOT_READY","startTime":"11:26","endTime":"10.35","duration":"15"}, {"state":"READY","startTime":"10.26","endTime":"10.35","duration":"16"}, {"state":"NOT_READY","startTime":"11:26","endTime":"10.35","duration":"17"}, {"state":"READY","startTime":"10.26","endTime":"10.35","duration":"18"}, {"state":"NOT_READY","startTime":"11:26","endTime":"10.35","duration":"19"} ]; for(let i=0;i<localArray.length;i++){ const tempOBJ = localArray[i]; if(tempOBJ.state === "LOGIN"){ // 如果已有未完成的会话,先存入结果 if(currentSession){ displayArray.push({...currentSession}); } // 初始化新会话 currentSession = { loginTime: tempOBJ.startTime, readyDuration: 0, notReadyDuration: 0, logOutTime: null }; } else if(tempOBJ.state === "READY" && currentSession){ currentSession.readyDuration += parseInt(tempOBJ.duration); } else if(tempOBJ.state === "NOT_READY" && currentSession){ currentSession.notReadyDuration += parseInt(tempOBJ.duration); } else if(tempOBJ.state === "LOGOUT" && currentSession){ currentSession.logOutTime = tempOBJ.startTime; // 会话结束,存入结果 displayArray.push({...currentSession}); currentSession = null; } } // 遍历结束后,检查是否还有未完成的会话(无LOGOUT) if(currentSession){ displayArray.push({...currentSession}); } // 生成所有表格行 let rows = ""; displayArray.forEach(session => { rows += `<tr> <td>${session.loginTime || '-'}</td> <td>${session.readyDuration}</td> <td>${session.notReadyDuration}</td> <td>${session.logOutTime || '-'}</td> </tr>`; }); $('#dataAdd').append(rows); }); </script> </head> <body> <table border="1"> <thead> <th>Login Time</th> <th>Ready Duration</th> <th>Not_ready Duration</th> <th>Logout Time</th> </thead> <tbody id="dataAdd"></tbody> </table> </body> </html>
关键修改说明
- 使用
currentSession单独存储当前正在统计的会话数据,每遇到新的LOGIN时,先收尾上一个未完成的会话(如果存在),再初始化新会话 - 遇到
LOGOUT时,立即将当前会话存入结果数组,并清空currentSession - 遍历结束后,额外检查是否有未完成的会话(即最后一次登录没有对应的
LOGOUT),确保这类会话也能被统计展示 - 最后统一生成所有表格行,避免原代码中每次循环都生成行的冗余操作
- 对未存在的
logOutTime显示-,提升表格可读性
内容的提问来源于stack exchange,提问作者Ganesh Putta
相关产品推荐
相关产品推荐

