代码将自己循环三次,并运行两次“If”语句和一次“Else”语句
Posted
技术标签:
【中文标题】代码将自己循环三次,并运行两次“If”语句和一次“Else”语句【英文标题】:Code will loop itself three time and runs "If" statement twice and "Else" statement once 【发布时间】:2019-05-09 17:12:02 【问题描述】:我不知道为什么,但是当在消息中添加“问题词”时,这段代码会重复 3 次,特别是它会运行 else 语句一次和 main if 语句两次。
bot.on('message', function(message)
const words = message.content.split(' ');
if (words.includes('sans'))
var questionwords = ['can', 'is', 'was', ];
for (i in questionwords)
if (!words.includes(questionwords[i]))
if (message.author.bot) return;
var chance = Math.floor(Math.random() * 2);
if (chance == 0)
message.channel.send('<:annoying_sans:520355361425981440>');
if (chance == 1)
message.channel.send('<:sans:519723756403425294>');
else
var chance = Math.floor(Math.random() * 3);
if (chance == 0)
message.channel.send('Maybe.');
if (chance == 1)
message.channel.send('Yes.');
if (chance == 2)
message.channel.send('No.');
);
【问题讨论】:
message.channel.send(...)
再次触发bot.on("message", ...)
...
传入的message
的值是多少,是字符串"questionwords"
吗?
questionwords 数组中有 3 个元素,你正在循环它,所以 if/else 运行了 3 次。
【参考方案1】:
在我看来,您似乎想知道 questionwords
数组中的单词是否在消息中。您已经知道如何使用Array.includes()
检查单个单词,但是多个单词更复杂。
如果您只想知道单词数组中的任何单词是否与 questionwords 数组中的任何单词匹配,可以使用Array.some()
:
var wereAnyFound = words.some(word => questionwords.indexOf(word) > -1);
// true or false
也许你想确保他们都在里面,使用Array.every()
:
var wereAllPresent = words.every(word => questionwords.indexOf(word) > -1);
// true or false
也许您想知道有多少,或者您想获得匹配项 (Array.filter()
):
var matches = words.filter(word => questionwords.indexOf(word) > -1);
// an array of matches
var howMany = matches.length;
// number
【讨论】:
【参考方案2】:就像 James 在 cmets 中所说的那样,因为 questionwords 数组中有三个单词,所以你的 for 循环会运行 3 次。然后它会为每个单词回复一次。
但是,如果您删除 for 循环并更改
if (!words.includes(questionwords[i]))
到
if (!words.includes("can" || "is" || "was"))
你会得到相同的结果,而机器人不会重复自己,因为它会搜索“can”或“is”或“was”而不是“can " 然后 "是" 然后 "是"。
【讨论】:
以上是关于代码将自己循环三次,并运行两次“If”语句和一次“Else”语句的主要内容,如果未能解决你的问题,请参考以下文章