如何在 quickmongoi 中过滤数据,以便仅在排行榜命令中显示公会中的用户名称

问题描述

js 和 quickmongo 用于排行榜命令,但它显示数据库中所有用户名称,我希望它仅显示公会中的用户名称。任何帮助都非常感谢?。我也试过过滤... 我当前的代码

const discord = require('discord.js')
module.exports.run = async (bot,message,args,db) => {
    let eco = await db.fetch(`eco_${message.author.id}`)
    if(eco !== 'START') return message.reply(`you/They have not yet started your economy journey.\n**Start it Now by typing \`gg ecostart\`**`)
    const ic = '<:mythicalcoin:842637611150606356>'
    let data = await db.startsWith("mon_");
    message.guild.members.fetch().then((m) => {
      m.forEach(user => {
          data.filter(i => i.ID.endsWith(user.id))
          })
}).catch((e) => {
        console.log(e)
        })
    
    let money = data.sort((a,b) => (b.data-a.data))
    
                      
    

   
    money.length = 20;
    var finalLb = ""; 
    for (var i in money) {
      finalLb += `${money.indexOf(money[i])+1}.${(await message.guild.members.fetch(money[i].ID.split('_')[1])).username ? (await message.guild.members.fetch(money[i].ID.split('_')[1])).username : "UnkNown User#0000"} || '\n' : ${ic} \`${parseInt(JSON.stringify(money[i].data)).toLocaleString()}\`\n`;
   }
    
        
    const embed = new discord.MessageEmbed()
    .setAuthor(`leaderboard`,message.guild.iconURL())
    .setColor("PURPLE")
    .setDescription(finalLb)
    .setFooter(bot.user.tag,bot.user.displayAvatarURL())
    .setTimestamp()
    message.channel.send(embed);
    }
module.exports.help = {
  name:"rich",aliases: ["lb","leaderboard"]
}

请帮帮我

解决方法

Array#filter() 不会就地修改数组,它只返回过滤后的结果。例如:

const arr = [1,2,3];
const filteredArr = arr.filter((num) => num !== 2);

// this still shows all the numbers,// because arr.filter() didn't modify the
// original array
console.log(arr); // [1,3];

// however,it did *return* a filtered
// array
console.log(filteredArr); // [1,3];

因此,您只需将 data 重新分配给过滤后的数组。

let data = await db.startsWith('mon_');
message.guild.members
 .fetch()
 .then((m) => {
  m.forEach((user) => {
   data = data.filter((i) => i.ID.endsWith(user.id));
  });
 })
 .catch((e) => {
  console.log(e);
 });

然而,这仍然行不通。这是因为您在回调中过滤数组。回调的全部目的是一个promise被解决后触发,所以当你能够过滤数组时,所有其他代码都已经被执行了。

理解承诺:

如果您选择使用 async/await,您可以像这样重构您的代码:

let data = await db.startsWith('mon_');
try {
 const m = await message.guild.members.fetch();
 m.forEach((user) => {
  data = data.filter((i) => i.ID.endsWith(user.id));
 });
} catch (e) {
 console.log(e);
}

在工作时,此解决方案不是最佳的,因为您必须为每个成员过滤和重新分配 data。相反,您应该尝试只做一次。您可以使用 Array#some()

实现此目的
const m = await message.guild.members.fetch();
data = data.filter((i) => m.some((user) => i.ID.endsWith(user.id)));