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

discord.js获取Guild角色列表返回嵌套数组的优化方案咨询

使用discord.js获取Discord服务器角色

你拿到嵌套数组不是API的问题,是遍历逻辑和需求不匹配:client.guilds.cache存的是机器人加入的所有服务器的集合,外层map会给每个服务器生成一个独立的角色名数组,最后把这些数组塞进一个大数组返回,自然就是二维结构。你测试的时候机器人只在1个服务器里,所以输出才是[ [ '@everyone', 'Demi God', 'Bot', 'God', 'Test' ] ]这种单元素嵌套的结果。

按你的实际需求选标准实现就行,没必要用数组解构那种取巧的方式:

  • 需求是拿单个指定服务器的角色列表
    根本不需要遍历整个服务器缓存,直接通过ID拿到目标服务器对象,再映射角色名就好,返回的直接是一维数组,没有嵌套问题:
    // 替换成你要查询的服务器ID
    const guild = client.guilds.cache.get('你的目标服务器ID');
    const roleNames = guild.roles.cache.map(role => role.name);
    
    console.log(roleNames)
    // 输出:['@everyone', 'Demi God', 'Bot', 'God', 'Test']
    
  • 需求是拿机器人加入的所有服务器的所有角色,合并成一个一维数组
    别用[].concat(...roles)或者取roles[0]这种写法,一旦机器人新加了服务器,这些写法要么丢数据要么报错。直接用打平方法就行:
    • 推荐用discord.js的Collection自带的flatMap,遍历和打平一步完成,是官方推荐的写法,性能更好:
      const allRoleNames = client.guilds.cache.flatMap(guild => 
        guild.roles.cache.map(role => role.name)
      );
      
    • 也可以用JS原生的flat()处理map后的二维数组,效果完全一致:
      const allRoleNames = client.guilds.cache
        .map(guild => guild.roles.cache.map(role => role.name))
        .flat();
      

补充:如果代码写在ready事件里执行,v13及以上版本的discord.js需要在初始化Client时开启Guilds intent,否则可能出现缓存不全、拿不到完整角色列表的问题。

内容的提问来源于stack exchange,提问作者Basile

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 15:57:12