You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 07:32:51