【问题标题】:Comparing a Guild ID to an identical string将公会 ID 与相同的字符串进行比较
【发布时间】:2021-03-19 15:17:48
【问题描述】:

作为我正在制作的机器人的一部分,我正在制作一个config 命令,该命令允许用户切换其服务器中的某些功能。为此,我使用了一个名为 config.json 的简单 JSON 文件来存储服务器的 ID 以及用于表示功能的几个布尔变量:

{
  "servers": [
    {
      "id": INSERT_ID,
      "delete": true
    },
    {
      "id": INSERT_ID,
      "delete": true
    },
    {
      "id": INSERT_ID,
      "delete": false
    }
  ]
}

我正在尝试获取它,因此当config 命令运行时,机器人会通过此列表查找与消息来源服务器的 ID 匹配的服务器。我已经制作了这个代码来做到这一点:

let data = fs.readFileSync(__dirname + "/config.json");
let config = JSON.parse(data);

let found = false;
for(let server of config.servers) {
    if (server.id === message.guild.id.toString()) {
        found = true;
        if (server.delete) {
            server.delete = false;
            message.reply("`Message Delete` has been toggled to `False`");
        } else {
            server.delete = true;
            message.reply("`Message Delete` has been toggled to `True`");
        }
    }
}
if (!found) {
    message.reply("I couldn't find this server in the database!");
}

let newData = JSON.stringify(config)
fs.writeFileSync(__dirname + "/config.jsom", newData);

如果我 console.log message.guild.id 它会打印一个与存储在我的 JSON 文件中的字符串匹配的数字,但是 IF 语句 if (server.id === message.guild.id) 的计算结果为 false,我不知道为什么。

【问题讨论】:

  • 尝试使用== 而不是===
  • @ChrisG 哇,效果很好,但我不知道为什么。你介意解释一下吗?
  • @Mastermind message对象是message事件返回的对象,即bot.on("message", message => {});
  • 简而言之:== 测试相等性,=== 测试身份。由于双方都有不同对象的属性,除非两个属性确实指向内存中的同一个对象,否则身份测试永远不会为真。

标签: javascript json discord.js


【解决方案1】:

我知道您的问题已经在 cmets 中得到解答,但我只是想提一下实现相同结果的不同方法(我还想发布该问题的完整答案)。

您可以简单地利用数组的内置 find 方法来查找符合您指定条件(匹配公会 ID)的项目,而不是使用 for/of 循环。这是您的代码中的示例:

let found = config.servers.find(server => server.id == message.guild.id);

if (found) {
    if (found.delete) {
        found.delete = false;
        message.reply("`Message Delete` has been toggled to `False`");
    } else {
        found.delete = true;
        message.reply("`Message Delete` has been toggled to `True`");
    }
}
else {
    message.reply("I couldn't find this server in the database!");
}

我个人认为通过减少嵌入式条件/循环的总数,这种方法比使用 for/of 循环更干净。并且此代码的​​功能与您当前的代码相同(实际上,该方法可能利用了 for/of 循环本身)。当然,您遇到的问题的主要解决方案是您应该使用 == 而不是 ===,因为它们在 javascript 中的含义不同,而且值得注意的是,您不需要调用 toString() on message.guild.id 使用 == 时。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-10-06
    • 2019-01-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多