我有一个基于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
(用户的输入)并查看它匹配的案例数量。然后,对于每个匹配,它将push
响应到botResponse
数组中,然后在最后,它将回复该数组中的所有消息。
示例
用户信息:Hi! How are you?
msgRes:hi how are you
Bot Matches:
hi
>将HELLO.
推送到数组
how are you
>将I AM FINE.
推送到数组
Bot回复: HELLO. I AM FINE.
这反过来又省去了为每种可能的组合编写if
的麻烦。
然而,在进一步研究之后,我不确定是否可以在交换机内部使用indexOf
。有没有人知道解决这个问题的方法,或者有更好的想法以同样的方式处理答案?
编辑:
避免XY问题(澄清我的问题)
我需要一个干净的替代方案来使用大量的else if
语句链。机器人将会响应数百个单词段。如果没有能力继续搜索匹配项,我就必须为每个组合编写一个新的else if
。
我希望有一种方法让它扫描每个匹配的语句,然后将每个匹配的响应组合成一个字符串。
编辑2: 我还要补充一点,这是在Tampermonkey而不是网站上运行。
答案 0 :(得分:30)
你只需要比较真实而不是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;
}
}
这是一种完全有效的逻辑分叉模式,称为“过载开关”。很多人可能没有意识到每个case:
都是一个表达式,而不仅仅是一个值,所以如果需要你甚至可以在那里放一个IIFE ......
答案 1 :(得分: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]);
}
}
}
在我看来,更改此程序更容易,因为如果将来有更多回复,您只需编辑种子。您甚至可以将种子存储在某个json文件上并读取它(通过ajax),这样如果有其他消息,则不需要更改程序。