【问题标题】:How to slice an array of member roles to ten in Discord.js如何在 Discord.js 中将一组成员角色分成十个
【发布时间】:2020-11-16 08:43:12
【问题描述】:

我有这段代码,它工作得非常好,直到达到1024 的限制,因为成员的角色显示在addField 值中。当一个成员在公会中拥有这么多角色时,它给了我错误。我正在尝试做的是机器人将如何发送成员拥有的 前 10 个 角色,如果超过,它将提供角色并继续使用<numbers> more

const roles = member.roles.cache.filter(r => r.id !== message.guild.id).map(r => r).join(" ")

【问题讨论】:

  • Array.prototype.slice
  • 谢谢。所以我尝试做slice(2, 10),但是当一个成员的角色低于10时,它返回为No Roles

标签: javascript node.js discord bots discord.js


【解决方案1】:

由于member.roles.cache 返回一个集合,您可以使用first() method 拉取前X 个角色。在您的情况下,您想检索前十个角色;所以,你会使用member.roles.cache.first(10)。这会从缓存中返回前十个角色的集合。

对于 <numbers> more 部分,您可以在 if 条件中使用 member.roles.cache.size 来决定您要如何拆分。

【讨论】:

    【解决方案2】:

    @fubar 提出您可以使用Array#slice() 来实现此目的。它对您不起作用并返回一个空数组 ([]) 的原因可能是因为您正在一个少于 3 个角色的公会成员上测试您的代码。当数组长度小于start 参数时,slice 方法将返回一个空数组。在你的情况下,你提供了2,而你应该提供0。所以,正如你所说,当一个公会成员的角色少于 10 个时,这种现象不会发生。

    您的代码似乎也有冗余。您的filter 方法永远不会减少GuildMemberRoleManager#cache 返回的数组的大小,因为公会的ID 实际上已经不会匹配该公会角色之一的ID。此外,您的 map 方法实际上并没有返回包含不同值的数组 - 您传入的回调函数只返回它接收到的相同值。这两个链式调用都可以安全地删除,并且您的代码的行为将保持不变。

    也就是说,这是更新后的代码:

    const rolesToDisplay = member.roles.cache.array().slice(0, 10); //start at index 0 and end before index 10
    

    【讨论】:

    • 我尝试使用您的代码,但遗憾的是它返回为not a function
    • 你能告诉我完整的错误信息吗?我的猜测是,您的代码中的某些东西是undefined
    • 请注意,我将该常量的名称更改为更具体的名称 - 从 roles(它是一个字符串)到 rolesToDisplay(它是一个数组)。您必须对其余代码进行任何必要的更改。
    • 这是整个错误:TypeError: member.roles.cache.slice is not a function
    • 啊,我明白了。 .cache 返回一个 Collection,而不是一个数组,它本身没有 .slice() 函数。我会更新我的答案。此类错误消息对于确定问题的原因非常重要。
    猜你喜欢
    • 2018-07-03
    • 2021-10-28
    • 2022-10-01
    • 2021-08-14
    • 2022-10-23
    • 1970-01-01
    • 2021-11-03
    • 2023-01-20
    • 2018-07-31
    相关资源
    最近更新 更多