如何让我的排行榜命令在 discord.js 上从高到低排序?

时间:2021-06-20 11:52:07

标签: node.js discord discord.js

这是我当前的代码:

function leaderboardembed() {
    const filtered = client.points.filter(p => p.guild === message.guild.id).array();
    let orilent;
    const sorted = filtered.sort((a, b) => b.vouches - a.vouches );
    let embeds = [];
    let j = 0;
    let first = (10)
    let maxnum = 50;
    orilent = sorted.length;
    if(isNaN(maxnum)) {
        console.log("maximum_leaderboard NOT A NUMBER")
        maxnum = 50;}
        if (maxnum > sorted.length) 
            maxnum = sorted.length + (10 - Number(String(sorted.length/10).slice(2)));
        if (maxnum < 10) maxnum = 10;
            for (let i = 10; i <= maxnum; i += 10) {
                const top = sorted.splice(0, 10);
        
                const embed = new Discord.MessageEmbed()
                    .setTitle(`\`${message.guild.name}\` | Leaderboard`)
                    .setTimestamp()
                    .setDescription(`Top ${i<orilent?i:orilent}/${orilent} Ranking:`)
                    .setColor(embedcolor);
                for (const data of top) {
                    j++;
                    try {
                        embed.addField(`**${j}**. \`${data.usertag}\``, ` | **Vouches:** \`${data.vouch}\``);
                    } catch {
                        embed.addField(`**${j}**. \`${data.usertag}\``, ` | **Vouches:** \`${data.vouch}\``);
                    }
                }
                embeds.push(embed);
            }
            return embeds;
        }
        async function leaderboard() {
            let currentPage = 0;
            const embeds = leaderboardembed();
            if (embeds.length == 1)
                return message.channel.send(embeds[0]).catch(e=>console.log("ranking: " + e))
        const lbembed = await message.channel.send(
            `**Current Page - ${currentPage + 1}/${embeds.length}**`,
            embeds[currentPage]).catch(e=>console.log("ranking: " + e));

        try {
            await lbembed.react("⏪");
            await lbembed.react("⏹");
            await lbembed.react("⏩");
        } catch (error) {
            console.error(error);
        }

        const filter = (reaction, user) => ["⏪", "⏹", "⏩"].includes(reaction.emoji.name) && message.author.id === user.id;
        const collector = lbembed.createReactionCollector(filter, {
            time: 60000
        });

        collector.on("collect", async (reaction, user) => {
            try {
                if (reaction.emoji.name === "⏩") {
                    if (currentPage < embeds.length - 1) {
                        currentPage++;
                        lbembed.edit(`**Current Page - ${currentPage + 1}/${embeds.length}**`, embeds[currentPage]);
                    }
                } else if (reaction.emoji.name === "⏪") {
                    if (currentPage !== 0) {
                        --currentPage;
                        lbembed.edit(`**Current Page - ${currentPage + 1}/${embeds.length}**`, embeds[currentPage]);
                    }
                } else {
                    collector.stop();
                    reaction.message.reactions.removeAll();
                }
                await reaction.users.remove(message.author.id);
            } catch (error) {
                console.error(error);
            }
        });
    }

这是执行命令时的显示方式

enter image description here

问题是大约有 1000 名成员,有些没有“凭证”和 ID,而只是显示从最高到最低的人。

以下是我的目标示例:

enter image description here

1 个答案:

答案 0 :(得分:0)

首先,要对它们进行排序,您确实需要将它们全部放在一个数组中。否则,难度会很大。这是 JavaScript 为我们提供的一个简单的排序函数:

var ranks = [7, 2, 9, 5, 10, 110]
ranks.sort() //don’t use this, this would put 10, 110, 2 etc since it’s alphabetical, you need to specify how to sort it
ranks.sort((a, b)=> a - b) //2, 5, 7, 9, 10, 110
//to reverse that
ranks.sort((a, b) => b-a)