Node.js读取等级文件实现用户排名系统的完整解决方案
完整解决方案:为用户计算等级排名
没问题,我来帮你补全这个排名计算的逻辑!核心思路是先收集所有用户的等级数据,按等级从高到低排序,再找到当前用户在排序列表中的位置,位置+1就是最终排名(因为数组索引从0开始)。
补全后的完整代码
const fs = require('fs'); const path = require('path'); // 你的原有代码基础上补充完整逻辑 this.IP = socket.remoteAddress; const dbFolder = './path/to/your/db/folder'; // 替换成你实际的数据库文件夹路径 const EXTENSION = '.lvl'; try { // 读取并解析当前用户的等级,处理内容无效的情况 this.level = parseInt(fs.readFileSync(path.join(dbFolder, `${this.IP}_level.lvl`), 'utf8').trim(), 10); if (isNaN(this.level)) this.level = 0; // 获取所有等级文件 const files = fs.readdirSync(dbFolder); const targetFiles = files.filter(file => path.extname(file) === EXTENSION); console.log('Level files: ' + targetFiles); // 步骤1:收集所有用户的IP和等级数据 const userLevels = targetFiles.map(file => { // 从文件名提取IP:比如"192.168.0.2_level.lvl" → "192.168.0.2" const ip = file.replace('_level.lvl', ''); let level = 0; try { // 读取并解析等级值,容错处理 level = parseInt(fs.readFileSync(path.join(dbFolder, file), 'utf8').trim(), 10); if (isNaN(level)) level = 0; } catch (err) { console.warn(`读取${ip}的等级文件失败:`, err.message); } return { ip, level }; }); // 步骤2:按等级降序排序,等级相同则按IP升序(保证排名稳定) userLevels.sort((a, b) => { if (b.level !== a.level) { return b.level - a.level; } // 等级相同时,按IP字符串排序避免排名随机波动 return a.ip.localeCompare(b.ip); }); // 步骤3:计算当前用户的排名 const userIndex = userLevels.findIndex(user => user.ip === this.IP); // 索引+1就是排名,未找到则默认最后一名 this.rank = userIndex !== -1 ? userIndex + 1 : userLevels.length + 1; console.log(`用户${this.IP} - 等级: ${this.level}, 排名: ${this.rank}`); } catch (err) { console.error('计算用户排名出错:', err.message); // 出错时设置默认值 this.level = 0; this.rank = -1; }
关键逻辑解释
- 数据收集:遍历所有.lvl文件,通过文件名提取用户IP,读取并解析文件内的等级值,同时加入错误处理,避免单个文件读取失败导致整个流程崩溃。
- 排序规则:优先按等级从高到低排序,等级相同时按IP字符串排序,确保排名结果稳定(不会因为文件遍历顺序变化导致排名波动)。
- 排名计算:用
findIndex找到当前用户在排序后数组中的位置,索引加1就是排名(比如第0位对应第1名)。如果用户不在列表中(比如文件刚被删除),默认设为总用户数+1,也就是最后一名。
可选优化:处理并列排名
如果需要支持等级相同的用户排名相同(比如两个用户等级都是100,都排第1),可以替换排名计算部分的代码:
// 处理并列排名的逻辑 let currentRank = 1; this.rank = 1; for (let i = 0; i < userLevels.length; i++) { if (userLevels[i].ip === this.IP) { this.rank = currentRank; break; } // 当前用户和下一个用户等级不同时,更新排名 if (i < userLevels.length - 1 && userLevels[i].level !== userLevels[i+1].level) { currentRank = i + 2; } }
内容的提问来源于stack exchange,提问作者kibibagoj
相关产品推荐
相关产品推荐

