【问题标题】:Object.forEach in filter function过滤器函数中的 Object.forEach
【发布时间】:2020-09-19 09:09:24
【问题描述】:

我正在使用Discord.js 在这个项目中编写一个 Discord 机器人。我正在尝试在消息上放置一个 ReactionCollector 并检查使用的反应是否在我的数据中。

数据存储在这个config.json中

{
  "botId": "xxxxxxxxxxxxxxx",
  "emojis": {
    "classes": [{
      "one": "716821724884238506",
      "two": "716821724863266876",
      "three": "716821724884369488"
    }]
  }
}

这是我要分配给 ReactionController 的过滤器。如果发现的反应在 config.json 中并且不是由机器人本身编写的,它应该触发。

const filter = (reaction, user) => {

  if(user.id === CONFIG.botId) {
    return false;
  }

  CONFIG.emojis.classes.forEach(obj => {
    Object.entries(obj).forEach(([key, value]) => {
      if(value === reaction.emoji.id) {
        console.log(`key: ${key}, value: ${value}`)
        return true;
      }
    });
  });
}

最后是我想要使用过滤器的收集器:

const collector = message.createReactionCollector(filter);
collector.on('collect', (reaction, user) => {
  console.log(`Collected: ${reaction.emoji.id}`);
  let alreadySetClass = '';
  if (message.channel.name.includes(reaction.emoji.name.toLowerCase())) {
    alreadySetClass = reaction.emoji.name.toLowerCase()
  }

  console.log("setClass: " + alreadySetClass)
  setChannelName(message.channel, reaction.emoji.name, alreadySetClass)

})

我通过收集反应得到的反应是一个MessageReaction 对象。

过滤器的 consol.log 将正确打印键、值对。但是收集器内部的console.log('collected: ') 根本不会执行。控制台中没有错误。我不知道我在这里错过了什么。我认为我编写过滤器的方式有问题。一些帮助会很棒。提前谢谢。

【问题讨论】:

  • 您能否提供您正在获取并尝试对其执行操作的数据结构
  • 我添加了我得到的对象作为指向 discord.js 文档的链接。它是一个 MessageReaction 对象。
  • @Frossy 我认为您应该将条件 user.id !== CONFIG.botId 移到嵌套 for 循环之外。该条件与表情符号 ID 条件是分开的。
  • @NguyễnViệtĐức 我确实尝试将它放在 forEach 之前,如果 user.id === CONFIG.botId 则返回 false 如果这就是您所说的结果并没有改变
  • 是的,它不会改变结果。这就是我评论而不是回答的原因。但是如果你仔细观察,对于对象内部的每个类,你必须再次检查botId,即使它们是相同的。

标签: javascript discord discord.js


【解决方案1】:

这是因为在您的过滤器中,您从 forEach 方法的回调中返回 true:这意味着回调将返回 true,但您的过滤器不会收到任何返回,因此将返回 undefined ,被解释为false(因此不会收集任何反应)。
尝试使用Array.some() 方法而不是forEach:如果任何回调为一个元素返回true,则该方法将返回true

我会这样做:

const filter = (reaction, user) => {
  // Check if the id is different and if for any of the classes ...
  return user.id != CONFIG.botId && CONFIG.emojis.classes.some(obj => {
    // ... at least one entry ...
    return Object.entries(obj).some(([key, value]) => {
      // ... has a value that matches the emoji id
      if (value == reaction.emoji.id) {
        console.log(`key: ${key}, value: ${value}`)
        // If so, return true
        return true
      }
    })
  })
}

PS:我知道有很多嵌套函数,它不是最易读的代码,但它应该可以解决问题。

【讨论】:

  • 这当然工作得很好。我在那里犯了一个绝对的新手错误。非常感谢您的快速帮助。
猜你喜欢
  • 1970-01-01
  • 2020-02-24
  • 1970-01-01
  • 1970-01-01
  • 2014-11-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-07-26
相关资源
最近更新 更多