我有一个基于 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/