indexOf在Switch中

Lea*_*eaf 9 javascript switch-statement tampermonkey

我有一个基于Javascript的机器人用于Xat聊天室,它也可以充当AI.我最近决定重做它的AI部分,因为它成为一个绝对庞大的else if声明链,变得几乎不可能使用.

我做了一些研究,并提出了如何处理响应的新想法.我先给你代码段:

function msgSwitch(id,msgRes) {
var botResponse = [];

switch (msgRes) {
  case (msgRes.indexOf("hi") !=-1):
    botResponse.push("HELLO. ");
  case (msgRes.indexOf("how are you") !=-1):
    botResponse.push("I AM FINE. ")
  case (msgRes.indexOf("do you like pie") !=-1):
    botResponse.push("I CAN'T EAT. THANKS, ASSHAT. ")
  default:
    respond (botResponse);
    spamCount(id);
    break;
}

}
Run Code Online (Sandbox Code Playgroud)

这里的想法是检查msgRes(用户的输入)并查看它匹配的案例数量.然后对于每个匹配,它将push响应到botResponse数组中,然后在结束时,它将回复该数组中的所有消息.

用户信息: Hi! How are you?

msgRes: hi how are you

机器人比赛:

hi>推HELLO.送到阵列

how are you>推I AM FINE.送到阵列

机器人回应: HELLO. I AM FINE.

这反过来又省去了if为每种可能的组合编写代码的麻烦.

然而,在进一步研究之后,我不确定它是否可以indexOf在开关内部使用.有没有人知道解决这个问题的方法,或者有更好的想法以同样的方式处理答案?

编辑:

避免XY问题(澄清我的问题)

我需要一个干净的替代方案来使用大量的else if陈述.机器人将会响应数百个单词段.如果没有能力继续搜索匹配,我必须else if 为每个组合写一个新.

我希望有一种方法让它扫描每个匹配的语句,然后将每个匹配的响应组合成一个字符串.

编辑2:我还应该补充说,这是在Tampermonkey而不是网站上运行的.

dan*_*vis 32

你只需要比较真实而不是msgRes(因为案例使用===比较),并使用break来防止令人讨厌的掉落行为:

function msgSwitch(id,msgRes) {
 var botResponse = [];

 switch (true) {
  case (msgRes.indexOf("hi") !=-1):
    botResponse.push("HELLO. "); break;
  case (msgRes.indexOf("how are you") !=-1):
    botResponse.push("I AM FINE. "); break;
  case (msgRes.indexOf("do you like pie") !=-1):
    botResponse.push("I CAN'T EAT. THANKS, ASSHAT. "); break;
  default:
    respond (botResponse);
    spamCount(id);
    break;
 }

}
Run Code Online (Sandbox Code Playgroud)

这是一种完全有效的逻辑分叉模式,称为"过载开关".很多人可能没有意识到每个case:都是一个表达,而不仅仅是一个值,所以如果需要你甚至可以在那里放一个IIFE ......


ail*_*een 5

关于你想要做的事情的要点我的两分钱:

function msgSwitch(id, msgRes) {
    var seed = {'hi': 'HELLO. ', 'how are you': 'I AM FINE'};
    var botResponse = [];

    for (var key in seed) {
        if (msgRes.indexOf(key) !== -1) {
            botResponse.push(seed[key]);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

在我看来,更改此程序更容易,因为如果您将来有更多响应,您只需编辑种子.你甚至可以将种子存放在某个json文件上并读取它(通过ajax),这样如果有其他消息,则不需要更改程序.