14 Stimmen

IndexOf innerhalb von Switch

Ich habe einen auf Javascript-basierten Bot für einen Xat-Chatraum, der auch als KI fungiert. Ich habe mich kürzlich dazu entschlossen, den KI-Teil davon neu zu machen, da er zu einer absolut riesigen Kette von else if-Anweisungen geworden ist, die fast unmöglich zu bearbeiten ist.

Ich habe ein wenig recherchiert und eine neue Idee entwickelt, wie man auf Antworten reagieren kann. Zuerst gebe ich Ihnen das Code-Segment:

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

switch (msgRes) {
  case (msgRes.indexOf("hi") !=-1):
    botResponse.push("HALLO. ");
  case (msgRes.indexOf("how are you") !=-1):
    botResponse.push("ES GEHT MIR GUT. ")
  case (msgRes.indexOf("do you like pie") !=-1):
    botResponse.push("ICH KANN NICHT ESSEN. DANKE, ARSCHLOCH. ")
  default:
    antworten (botResponse);
    spamCount(id);
    break;
}

}

Die Idee hier ist, msgRes (die Eingabe des Benutzers) zu überprüfen und zu sehen, wie viele Fälle es gibt, die übereinstimmen. Dann für jedes Übereinstimmung wird die Antwort in das botResponse-Array eingefügt, und am Ende wird mit allen Nachrichten in diesem Array geantwortet.

Beispiel

Benutzer-Nachricht: Hi! How are you?

msgRes: hi how are you

Bot-Übereinstimmungen:

hi > fügt HALLO. zum Array hinzu

how are you > fügt ES GEHT MIR GUT. zum Array hinzu

Bot antwortet: HALLO. ES GEHT MIR GUT.

Dies erspart mir die Mühe, für jede mögliche Kombination ein if schreiben zu müssen.

Nach genauerer Prüfung bin ich mir jedoch nicht sicher, ob es möglich ist, indexOf in einem switch zu verwenden. Weiß jemand eine Lösung dafür oder hat eine bessere Idee für die Handhabung von Antworten in gleicher Weise?

EDIT:

Um das XY-Problem zu vermeiden (um mein Problem zu klären)

Ich brauche eine saubere Alternative zur Verwendung einer riesigen Kette von else if-Anweisungen. Es wird Hunderte von Wortsegmenten geben, auf die der Bot antworten wird. Ohne die Möglichkeit, nach Übereinstimmungen zu suchen, müsste ich für jede Kombination ein neues else if schreiben.

Ich hoffe auf eine Möglichkeit, jede Aussage auf Übereinstimmungen zu überprüfen, und dann die Antwort für jede Übereinstimmung zu einem einzigen String zusammenzufassen.

EDIT 2: Ich sollte auch hinzufügen, dass dies auf Tampermonkey läuft und nicht auf einer Website.

38voto

dandavis Punkte 15507

Sie müssen nur mit true vergleichen anstelle von msgRes (da Fälle === Vergleich verwenden) und break verwenden, um das lästige Durchfallverhalten des Switch-Verhaltens zu verhindern:

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("ES GEHT MIR GUT. "); break;
  case (msgRes.indexOf("do you like pie") !=-1):
    botResponse.push("ICH KANN NICHT ESSEN. DANKE, DUMMKOPF. "); break;
  default:
    respond (botResponse);
    spamCount(id);
    break;
 }

}

Dies ist ein vollkommen gültiges logisches Verzweigungsmuster, bekannt als "überladener Switch". Viele Leute realisieren vielleicht nicht, dass jeder case: ein Ausdruck ist, nicht nur ein Wert, also könnten Sie sogar eine IIFE dort hinein setzen, wenn nötig...

4voto

ailveen Punkte 573

Meine Meinung zum Hauptpunkt dessen, was du versuchst zu tun:

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

Meiner Meinung nach ist es einfacher, dieses Programm zu ändern, da du nur den Seed bearbeiten musst, wenn du in Zukunft mehr Antworten hast. Du kannst sogar den Seed in einer JSON-Datei speichern und ihn (über Ajax) lesen, damit das Programm nicht geändert werden muss, wenn es zusätzliche Nachrichten gibt.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X