我想检查3秒后创建了多少角色,但是filtered.size
日志未定义,我如何才能完成这一点?
wait(3000)
const logs = await guild.fetchAuditLogs({ type: 'ROLE_CREATE', });
if( !logs) return;
const entry = logs.entries;
const filtered = entry.filter(e => e.createdAt = Date.now());
console.log(filtered.size);
注意:这段代码是为@discordjs/collection v0.7.0和discordjs v13.8.1编写的
<Collection>.entries
不是属性
一个Discord.js集合是一个带有一些额外功能的Map。如文档中所述,存在一个称为entries()
的函数。因此,出现了两个问题。
- 由于
Collection
上不存在entries
属性,因此您的代码返回一个函数。代码试图在函数上运行filter
,结果返回undefined,因为Function.filter()
不起作用。 - 即使
log
被更新为<Collection>.entries
作为一个函数,这仍然会返回一个错误,因为.entries(...).filter
不是一个函数(在Runkit上演示)
使用内置的filter
函数
在Collection文档中,有一个名为filter
的函数,其工作原理与Array.filter()
相似。因此,可以跳过创建过滤器。如果仍然保留entry
变量,则只需将.entries
转换为.entries()
。它看起来像这样:
// Skip creating the entry variable
const filtered = logs.filter(e => e.createdAt === Date.now());
// Or, if you'd like to keep the variable
const entry = logs.entries();
const filtered = entry.filter(e => e.createdAt === Date.now());
同样,在使用filter(...)
时,您使用的是单个=
,它将日志的createdAt
属性设置为Date.now()
。为了解决这个问题,我使用了===
,它只选择createdAt
属性为严格的条目set toDate.now()
.
将.entries
转换为函数并将其排序为Array
首先,我们需要将entries
改为entries()
。之后,我们将使用Array.from
将从Collection.entries()
返回的IterableIterator转换为可以过滤的Array。之后,我们将使用与上述解决方案中相同的filter
函数。
const entry = logs.entries();
const filtered = Array.from(entry).filter(e => e.createdAt === Date.now());