代码将自己循环三次,并运行两次“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”语句的主要内容,如果未能解决你的问题,请参考以下文章

python中为啥我的for循环里嵌套的if只能循环一次?

循环语句

for循环与if判断语句的运用

针对IF语句测试范围值数组的最佳方法

python一个脚本循环两次

第三次实验