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();
- 推荐用discord.js的Collection自带的
补充:如果代码写在
ready事件里执行,v13及以上版本的discord.js需要在初始化Client时开启Guildsintent,否则可能出现缓存不全、拿不到完整角色列表的问题。
内容的提问来源于stack exchange,提问作者Basile
相关产品推荐
相关产品推荐

