我如何过滤 quickmongoi 中的数据,以便它仅在排行榜命令中显示公会中的用户名称
how do i filter a data in quickmongoi so that it would show only names of users who are in the guild only in the leaderboard command
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()
不会就地修改数组,它只会 returns 过滤后的结果。例如:
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);
});
但是,这仍然行不通。这是因为您在回调中过滤数组。回调的全部目的是在承诺被解决后触发,所以当你能够过滤数组时,所有其他代码都已经执行了。
理解承诺:
- https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Using_promises
- https://discordjs.guide/additional-info/async-await.html
- https://javascript.info/async-await
如果您选择使用 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)));
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()
不会就地修改数组,它只会 returns 过滤后的结果。例如:
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);
});
但是,这仍然行不通。这是因为您在回调中过滤数组。回调的全部目的是在承诺被解决后触发,所以当你能够过滤数组时,所有其他代码都已经执行了。
理解承诺:
- https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Using_promises
- https://discordjs.guide/additional-info/async-await.html
- https://javascript.info/async-await
如果您选择使用 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)));