javascript - Switch 中的 indexOf

标签 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;
}

}

这里的想法是检查msgRes(用户的输入)并查看它匹配了多少个案例。然后对于每个匹配项,它将响应推送botResponse数组,然后在最后,它会回复该数组中的所有消息。

示例

用户消息:您好!你好吗?

msgRes: 嗨,你好吗

机器人匹配:

hi > 将 HELLO. 推送到数组

你好吗 > 将 I AM FINE. 推送到数组

机器人响应: 你好。我很好。

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

但是,在进一步研究之后,我不确定是否可以在开关内部使用 indexOf。有谁知道解决此问题的方法或有更好的想法以相同的方式处理响应?

编辑:

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

我需要一个干净的替代方案来使用大量的 else if 语句链。机器人将响应数百个词段。如果它无法继续搜索匹配项,我将不得不为每个组合编写一个新的 else if

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

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

最佳答案

您只需要与 true 而不是 msgRes 进行比较(因为 cases 使用 === 比较),并使用 break 来防止烦人的 fall-though 切换行为:

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;
 }

}

这是一个完全有效的逻辑 fork 模式,被称为“过载开关”。很多人可能没有意识到每个 case: 都是一个表达式,而不仅仅是一个值,因此如果需要,您甚至可以在其中放置一个 IIFE...

关于javascript - Switch 中的 indexOf,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22277447/

相关文章:

javascript - 将对象拆分为两个属性

javascript - 返回 2 个不同日期的小时差

javascript - 单击一堆需要等待 Ajax 调用才能继续使用 Greasemonkey 的按钮

javascript - Tampermonkey 匹配所有子目录

javascript - Photoshop Javascript 获取选定的路径项目?

javascript - 使用 axios.get 时套接字挂起,但使用 https.get 时不会

java - switch 的替代方案——替换字符

c# - 在枚举值上切换大小写

javascript - JavaScript switch 语句中的语法错误

javascript - 在 JS 中将文本转换为整数