JavaScript开发Discord机器人:解决嵌套对象按XP排序并获取前3成员的TypeError问题
解决Discord机器人XP排名排序的TypeError问题
首先,你遇到的Uncaught TypeError: guildStats.slice错误根源很明确:guildStats是一个JavaScript对象(键值对集合),而slice()是数组专属的方法,对象无法直接调用它。
要实现按XP值排序并取前3的需求,我们需要先把对象转换为可排序的数组,再进行排序和筛选,步骤如下:
步骤1:将对象转换为数组
使用Object.entries(guildStats)可以把对象的每个键值对转换为[成员ID, 统计数据]形式的数组元素,这样我们就能用数组的排序方法了。
步骤2:按XP值降序排序
排序时要注意,我们需要从高到低排列(这样前3就是XP最高的),所以排序回调函数应该返回b.xp - a.xp(如果是升序则是a.xp - b.xp)。
步骤3:截取前3名并格式化输出
用slice(0,3)截取排序后的前3个元素,然后遍历输出成你想要的格式。
修正后的完整代码
var guildStats = { '1234567': { xp: 95, level: 0, last_message: 1631181685724, invited: {}, invited_by: 0 }, '0987654': { xp: 13, level: 0, last_message: 1631181527799, invited: {}, invited_by: 0 }, '243562345': { xp: 18, level: 0, last_message: 1631181537020, invited: {}, invited_by: 0 }, '76533465': { xp: 14, level: 0, last_message: 1631181536875, invited: {}, invited_by: 0 }, '34667634567': { xp: 8, level: 0, last_message: 1631181659142, invited: {}, invited_by: 0 }, '346534': { xp: 98, level: 0, last_message: 1631181638743, invited: {}, invited_by: 0 }, '34343677677886': { xp: -63, level: 0, last_message: 1631181584314, invited: {}, invited_by: 0 }, '987654345676543': { xp: 20, level: 0, last_message: 1631181589153, invited: {}, invited_by: 0 }, '75634576786588': { xp: -140, level: 0, last_message: 1631181593304, invited: {}, invited_by: 0 }, '34343434556566': { xp: 43, level: 0, last_message: 1631181663340, invited: {}, invited_by: 0 } }; // 1. 转换为[成员ID, 统计数据]的数组 const statsArray = Object.entries(guildStats); // 2. 按XP降序排序 statsArray.sort((a, b) => b[1].xp - a[1].xp); // 3. 截取前3名并格式化输出 const top3 = statsArray.slice(0, 3); console.log("The top 3 members by XP are:"); top3.forEach((member, index) => { console.log(`${index + 1}. ${member[0]}`); });
输出结果
运行这段代码后,你会得到完全符合预期的输出:
The top 3 members by XP are: 1. 346534 2. 1234567 3. 34343434556566
如果是在Discord机器人中使用,只需要把console.log替换成机器人发送消息的API(比如message.channel.send())即可。
内容的提问来源于stack exchange,提问作者JamesG
相关产品推荐
相关产品推荐

