【问题标题】:Skill List with pages带页面的技能列表
【发布时间】:2021-05-19 14:46:17
【问题描述】:

我有一个包含大约 40 种不同技能的列表,我想做的是在一个页面上打印出其中的 10 个,然后在下一页的列表中打印下 10 个,依此类推。我希望人们输入!list [page] 就像!list 2 一样可以查看技能的第二页。我假设我需要存储除该列表中的 10 项之外的所有技能,但我不知道如何去做。谢谢。

    let text = ""

    const skillDB = await Skill.find({
    }).sort({
        skillRarity: -1
    })

        for (let i = 0; i < skillDB.length; ++i) {

            text += `\`${skillDB[i].skillSymbol}\` ${skillDB[i].skillName}\n`
        }

        const embed = new MessageEmbed()
            .setDescription(text)
        return message.channel.send(embed)

【问题讨论】:

    标签: mongoose discord discord.js


    【解决方案1】:

    您可以使用数组的.slice() 方法进行分页。它将原始数组的一部分的副本返回到从开始索引到结束的新数组中。

    检查以下示例:

    function paginate({ array, size = 5, page = 1 }) {
      return array.slice((page - 1) * size, page * size);
    }
    
    console.log(paginate({
      array: [1, 2, 3, 4, 5, 6, 7, 8],
      size: 3,
      // first page
    }));
    console.log(paginate({
      array: [1, 2, 3, 4, 5, 6, 7, 8],
      size: 3,
      page: 2
    }));
    console.log(paginate({
      array: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10],
      size: 4,
      page: 3
    }));

    在您的代码中,它看起来像这样:

    let text = '';
    const page = parseInt(args[0], 10);
    const size = 10;
    
    // probably check if page is valid
    
    const skillsDB = await Skill.find({}).sort({ skillRarity: -1 });
    const skills = skillsDB.slice((page - 1) * size, page * size);
    
    for (let skill of skills) {
      text += `\`${skill.skillSymbol}\` ${skill.skillName}\n`;
    }
    
    const embed = new MessageEmbed().setDescription(text);
    return message.channel.send(embed);
    

    您也可以直接使用 Mongoose。您可以使用.skip().limit() 来限制结果数量并跳过一些页面:

    const perPage = 10;
    const page = args[0] >= 1 ? args[0] - 1 : 0;
    const skills = await Skill.find({})
      .sort({ skillRarity: -1 })
      .limit(perPage)
      .skip(perPage * page);
    
    if (!skills.length) {
      return message.channel.send('Looks like that page does not exist.');
    }
    
    const text = skills
      .map((skill) => `${skill.skillSymbol} ${skill.skillName}`)
      .join('\n');
    
    const embed = new MessageEmbed().setDescription(text);
    return message.channel.send(embed);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-02-21
      • 1970-01-01
      • 2021-05-10
      • 2016-10-14
      • 2019-01-23
      相关资源
      最近更新 更多