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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.30 10:47:31