0

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"]
}

请帮帮我

4

1 回答 1

1

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, 2, 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)));
于 2021-06-04T16:15:35.237 回答