当前位置: 首页 > 知识库问答 >
问题:

不一致js err:它正在删除整个数组。快的和不和谐。js

孙正业
2023-03-14

我对JavaScript非常陌生,所以我决定通过创建一个不和谐机器人来挑战自己。我想做的是检测用户是否有名为“棒”的项目,如果他有,机器人会回答“你已经拥有这个项目了!”否则,机器人将让用户购买该物品。当我让它删除数组中的“临时”时,它会删除整个数组,我如何修复这个问题?如果有任何方法可以解决这个问题并更好地“优化”它,那将是惊人的。

这是一段代码。

变量为:const db=require('quick.db');const{MessageEmbed}=require('discord.js');

db.push(message.author.id, "Temporary") //This is so the .includes() function could work.
    let checkForItems = db.get(message.author.id)
    console.log(checkForItems);


            if(args[0] === "Rod"){

                //See if the user has "Rod" in their inventory
                let a1 = (checkForItems.includes('Rod'));
                console.log(help);

                if(a1 === false){

                    if (money.balance < 15000){
                        message.channel.send(`Insufficent Funds! You have ${money.balance} coins while the item you are trying to buy costs 15000 coins.`)
                    } else {

                        console.log("A User has purchased a Rod.")

                        let items = db.fetch(message.author.id, {items: [] } )

                        message.channel.send("You have bought 1 Rod.");
                        db.push(message.author.id, "Rod")
                    }
                } else {

                    message.channel.send("You already have this item!")

                }


            }
            db.delete(message.author.id, 'Temporary') //This is not working, how do I fix this? Its deleting the entire array.

共有1个答案

麹渊
2023-03-14

方法db.delete(key)只接受一个参数,该参数是要从数据库中删除的数据库中的键。因此,当您执行db.delete(message.author.id)时,您实际上要做的是删除保存在键message.author.id中的内容,当然,这是您的整个数组。

为了更好地可视化正在发生的事情,我们假设您的数据库以JSON格式显示如下:

{
  "userID1": ["Item 1", "Item 2", "Temporary"],
  "userID2": ["Item 6", "Item 9"]
}

现在,如果您执行db。delete(message.author.id),假设作者的id是“userID1”,它将从数据库中删除整个“userID1”。您的数据现在如下所示:

{
  "userID2": ["Item 6", "Item 9"]
}

显然,这就是导致整个阵列被删除的原因。而quick。db有一种实用的方法可以将项推送到数组中,但它没有任何类似的方便方法可以从数组中删除项。你需要做一些额外的工作才能做到这一点。

然而,基于您的代码,我不明白为什么您需要这个“临时”字符串。let项目=db.fetch(message.author.id,{项目: [] } )一行似乎表明数据库的实际结构是这样的:

{
    "userID1": {
        items: ["Item 1", "Item 2", "Item 9"]
    }
}

基于这种结构,您根本不需要推送“临时”。事实上,这样做是没有意义的。如果我正确理解了您的数据库结构,那么我将以以下方式重写您的代码:

let items = db.get(message.author.id, {items: []}).items;
console.log(items);
if(args[0] === "Rod"){
    //See if the user has "Rod" in their inventory
    let a1 = items.includes('Rod');

    if(!a1){
        if (money.balance < 15000){
            message.channel.send(`Insufficent Funds! You have ${money.balance} coins while the item you are trying to buy costs 15000 coins.`)
        } else {
            console.log("A User has purchased a Rod.")

            //Add "Rod" item to user's "items" array
            items.push("Rod");
            db.set(message.author.id + ".items", items);

            message.channel.send("You have bought 1 Rod.");
        }
    }
    else message.channel.send("You already have this item!");
}

我发现这是一个更整洁的解决方案。这应该会更好。但是,我仍然想回答您最初的问题,即如何使用quick从数组中删除项。db

在本例中,假设您的数据库结构看起来更像我在答案顶部显示的第一个数据库结构,例如db。get(message.author.id)返回用户拥有的项目数组。您已经知道可以使用db将项添加到数组中。推送()。以下是从数组中删除临时字符串的方法:

let items = db.get(message.author.id, []);
let index = items.indexOf("Temporary");

//If "Temporary" does not exist in the array, 'index' is -1
//We use Array.splice(index, elementsToRemove) to remove an item from the array
if (index > -1) items.splice(index, 1);

//Now we update the database with the newly modified array
db.set(message.author.id, items);

这应该可以回答您在quick中如何从数组中删除单个元素的问题。db,前面的代码片段应该回答您关于如何最好地“优化”功能的问题。

如果您愿意,我已经编写了一个名为evg的模块。js为quick添加了简单的实用方法(例如从数组中删除项)。db。你可以在这里找到它。您不需要直接使用我的模块,但您可以查看其代码,了解如何使用quick完成某些事情。db。那里的代码确实简化了我对quick的使用。在我以前的一些机器人程序中,db作为存储系统。

 类似资料:
  • 我使用Python3.6idle编写了一个bot,我想添加一个命令,但我不知道如何添加它。你们中的一些人能帮我举一些例子或建议吗?我会很高兴的,谢谢。

  • 我正在尝试使用discord删除已创建的角色,该角色使用的是。js。 终端中的错误显示: DiscordAPIError:缺少权限 虽然我已经给了我的机器人所有权限。 代码:

  • 我的问题是,我在尝试删除不一致的邮件时收到错误。 我收到这个错误: 我还尝试了,但我收到一个错误,告诉我消息未定义。 当我删除试图删除消息的代码时,程序就会工作。

  • 我有一些不和谐的问题。js删除函数。我使用这段代码在从频道中删除图像时从用户的余额中删除1点,这是第一次一切正常,但当我尝试删除我发送的另一个图像时,机器人将从我的余额中删除1点,而不是从我的余额中删除1点,因为从机器人启动开始,总共删除了多少图像。示例:我删除一个图像,机器人将从我的余额中删除1个点,然后如果我删除我上传的另一个图像,而不是删除1个点,它将从我的余额中删除2个点,因为它将计算删除

  • 我正在尝试制作一个Python Discord机器人,它首先可以删除通道中的消息。我希望它是以《终结者3》为主题的,这样它会由用户说天网开始,然后机器人要求激活Y或N?当用户输入Y时,它会删除频道中的所有消息,如果用户输入N,它会说审判日不可避免。任何帮助都将不胜感激。

  • 我正在为我朋友组的游戏服务器开发一个discord机器人。我想添加一个命令,使语音频道中的每个人都静音。我想这是可以工作,但它返回时不是一个函数,导致机器人崩溃。这是的工作原理是,它将服务器静音发送消息的成员,但显然不是我想要的整个频道。我对不和谐是全新的。js和文档有点混乱。谢谢你的时间!