Discord.js |如何使用.sort()对获取的邮件进行排序

时间:2019-07-01 06:25:24

标签: javascript discord discord.js

我有以下示例代码:

.sort((a, b) => b.createdAt - a.createdAt)

我已经获取并过滤了通道中的消息(该通道有8条消息),但是filter返回了一个集合,并且集合不一定是按顺序排列的。

那么我该如何对邮件进行排序,以便上面的公式起作用?

A screenshot of my code

(请忽略上面屏幕截图中的.first())

集合中有4条消息,.first()仅收集第一条消息,我希望将所有四个值都这样嵌入:

newchannel.fetchMessages().then(messages => {
    var valuesA = messages.filter(m => m.author.id === message.author.id).first();
    var valuesB = messages.filter(m => m.author.id === message.author.id).second();
    var valuesC = messages.filter(m => m.author.id === message.author.id).third();
    var valuesD = messages.filter(m => m.author.id === message.author.id).fourth();
    const embed = {
        "fields": [
            {
                "name": "Type of code:",
                "value": valuesA.content,
                "inline": true
            },
            {
                "name": "Type of code:",
                "value": valuesB.content,
                "inline": true
            },
            {
                "name": "Type of code:",
                "value": valuesC.content,
                "inline": true
            },
            {
                "name": "Type of code:",
                "value": valuesD.content,
                "inline": true
            }
        ]
    };
}

很显然,这不是完整的代码或完整的嵌入,但是它显示了所需的一切。

如果您有任何问题,请随时在评论中提问。

2 个答案:

答案 0 :(得分:1)

Collection扩展了类型Map

  

Map中的键是有序的,而添加到对象中的键则没有顺序。因此,在对其进行迭代时,Map对象将按插入顺序返回键。

与对象相反,地图具有特定的顺序。

Discord.js Collection具有sort方法。

由于fetchMessages的返回类型在解析后为Promise<Collection<Snowflake, Message>>,因此您应该能够按createdAt进行排序。

client.on('message', async function(msg) {
  let chan = msg.channel;
  let sortedMsgs = await chan.fetchMessages(option)
    .then(msgs => {
      msgs.sort((a, b) => b.createdAt > a.createdAt) 
    })
});

免责声明:我现在无法测试此代码。 compareFunction格式未在文档中定义,因此可能不是>

答案 1 :(得分:0)

因此,在寻求帮助几天后,我最终自己找到了解决方案:

我只是不使用.sort()而是使用values [number] .content来选择每条消息。

我的新工作代码:

newchannel.fetchMessages().then(messages => {
    var values = messages.filter(m => m.author.id === message.author.id);
    values = values.first(4);
    const embed = {
        "fields": [
            {
                "name": "Type of code:",
                "value": values[0].content,
                "inline": true
            },
            {
                "name": "Type of code:",
                "value": values[1].content,
                "inline": true
            },
            {
                "name": "Type of code:",
                "value": values[2].content,
                "inline": true
            },
            {
                "name": "Type of code:",
                "value": values[3].content,
                "inline": true
            }
        ]
    };
}