Probleme mit Vergleich von Arrays in selbstgeschriebener Suchfunktion

  • Hallöchen,


    ich bin ziemlich unerfahren mit Javascript und würde mich über ein wenig Hilfestellung von euch freuen. Vielen Dank schonmal im Voraus!


    Ich bin aktuell dabei, für meine Abschlussarbeit eine Umfrage erstellen. In dieser Umfrage würde ich über Javascript gerne ein Suchfenster einbinden, welches eingegebene Suchbegriffe mit einer Wortdatenbank abgleicht. Wenn ein oder mehrere Wörter mit dieser Datenbank übereinstimmen, soll ein bestimmter Text ausgegeben werden. Dabei muss muss nicht die gesamte Eingabe zu Wörtern aus der Wortliste passen, es reichen auch einzelne (Könnte man durch einen weiteren Zähler eine vordefinierte Minimalanzahl einsteuern?). Nun habe ich folgende Probleme:


    1. Eigentlich wollte ich beide Arrays mit .equals() vergleichen. Da bekomme ich allerdings überhaupt keine Ausgabe. Stattdessen funktioniert es aber mit dem Vergleichsoperator ==. Soll das so?

    2. Das eigentliche Problem ist allerdings, dass das Programm niemals in den if-Teil springt, selbst wenn ich ein exaktes Wort aus der Liste verwende. Es kommt immer die Ausgabe aus dem else-Teil. Als ich die Eingabe noch nicht in substrings gesplitted hatte, ging das mit einem Wort allerdings problemlos.


    Könnt ihr mir vllt sagen, wo der Fehler liegt? Ich bin mittlerweile ratlos.


    Viele Grüße

    brina42


  • 1. Eigentlich wollte ich beide Arrays mit .equals() vergleichen.

    equals ist keine native JavaScript Methode. Aus welcher Library ist die?
    edit: Ich verstehe... ^^


    Stattdessen funktioniert es aber mit dem Vergleichsoperator ==. Soll das so?

    Du meinst hier:

    JavaScript
    1. splittedEingabe[j].toLowerCase() == wortliste[i]

    Ja, das soll so sein. (Was wundert dich denn daran?)


    2. Das eigentliche Problem ist allerdings, dass das Programm niemals in den if-Teil springt, selbst wenn ich ein exaktes Wort aus der Liste verwende. Es kommt immer die Ausgabe aus dem else-Teil. Als ich die Eingabe noch nicht in substrings gesplitted hatte, ging das mit einem Wort allerdings problemlos.

    Hast du die Funktion schonmal gedebuggt? (Für den Anfang schreib mal Konsolenausgaben in jeden If-Zweig).


    War das vorher nur eine einfache Schleife?
    Das Problem, dass du hast, ist, dass break nur aus der Inneren Schleife springt und dann mit dem nächsten Eintrag der Wortliste weitermacht.

    Wenn das letzte Wort in der Wortliste kein Treffer ist, siehst du nur die Ausgabe aus dem else-Zweig, denn die Ausgabe wird jedes Mal überschrieben.


    Ich würde dir vorschlagen, statt das Ergebnis direkt in dein HTML zu schreiben, in deiner Schleife ein Ergebnisobjekt zu füllen, das jeden Eintrag deines Wortarrays auf einen boolischen Wert mappt, der anzeigt, ob das Wort gefunden wurde oder nicht.
    Das würde dann so in etwa aussehen:

    Wenn das Objekt erstellt wurde, kann man es dann auswerten.


    Wenn es nur um Treffer oder nicht geht, würde ich dir empfehlen eine Boolische Variable zu deklarieren mit false zu initialisieren und wenn ein Begriff gefunden wurde, auf true zu setzen:

  • War das vorher nur eine einfache Schleife?
    Das Problem, dass du hast, ist, dass break nur aus der Inneren Schleife springt und dann mit dem nächsten Eintrag der Wortliste weitermacht.

    Wenn das letzte Wort in der Wortliste kein Treffer ist, siehst du nur die Ausgabe aus dem else-Zweig, denn die Ausgabe wird jedes Mal überschrieben.

    Genau, davor war das eine einfache Schleife. Okay super, jetzt verstehe ich glaube ich das Problem. Hatte das mit dem break auch in Erwägung gezogen, aber wäre niemals auf deinen Lösungsansatz gekommen.


    Zitat

    Ich würde dir vorschlagen, statt das Ergebnis direkt in dein HTML zu schreiben, in deiner Schleife ein Ergebnisobjekt zu füllen, das jeden Eintrag deines Wortarrays auf einen boolischen Wert mappt, der anzeigt, ob das Wort gefunden wurde oder nicht.

    Ahh, das checke ich leider gerade nicht ganz. Vllt liegts an der Formulierung oder ich stehe auf dem Schlauch. Auf einen booleschen Wert mappt, wie stelle ich das an? Gibt es dafür eine Funktion? Oder könntest du es nochmal in anderen Worten erklären?

  • Was ich damit meine ist, dass du bei jedem Schleifendurchlauf das Ergebnis einem Objekt festhältst.

    So in Etwa:

    Hinterher hast du dann ein Objekt wi in #4 beschrieben.

  • Es funktioniert leider noch immer nicht. Wahrscheinlich ist hier irgendwo ein grober Schnitzer drin. Am Ende ist das Objekt scheinbar immer auf true gesetzt. Kann mir jemand sagen, wo der Fehler liegt? Würde mich wirklich freuen, wenn da jemand nochmal kurz drüberschauen könnte.


  • Du brings da beide Lösungsansätze durcheinander.


    JavaScript
    1. if (treffer = true) {}

    So kannst du nicht das Objekt nach wahren Werten überprüfen.

    Ein Objekt (egal was drin ist) ist immer truthy.


    Versuch es so:

    Dann überprüfe treffer.

  • Wenn es dir nur darauf ankommt, ob überhaupt ein Treffer da ist, kannst Du an dieser Stelle auch mit Vorteil eine der eingebauten Funktionen indexOf oder includes verwenden und damit die innere Schleife weg rationalisieren:

    https://wiki.selfhtml.org/wiki…ipt/Objekte/Array/indexOf

    https://wiki.selfhtml.org/wiki…pt/Objekte/Array/includes

  • Sempervivum
    Und hier kommen wir wieder in die Diskursion, wieweit wollen wir helfen.

    Ich versuche immer den Gedankengang des Fragestellers nachzuvollziehen und den Weg so weit es möglich ist weiter zu verfolgen.
    So dass man entweder nur kleine Tips geben muss (je nachdem welches Lever an Erfahrung der Fragesteller hat) oder die Lösung so schreiben kann, dass sie dem entspricht, was ohnehin schon da ist.

    Das dass dann nicht die modernste / eleganteste / kompatibel für IE / mobile optimiert / best practice / barrierefreiste Lösung ist, nehm ich dabei in Kauf, denn ich bin der Meinung es sollte bei einem Problem geholfen und nicht eine völlig neue Lösung präsentiert werden.
    zwischendurch kann man noch Tipps für
    Aber du weißt ja, dass das immer wieder ein Balanceakt ist.

  • Hallo ihr beiden,


    vielen Dank euch beiden für die Hilfe! Eure Tipps haben mir sehr weitergeholfen.


    AndreasB : Boolesche Werte und ich scheinen keine Freunde zu werden. Nachdem ich aber den Vorschlag von Sempervivum umgesetzt habe, bin ich auch auf eine Lösung für die zwei for-Schleifen gekommen. Anstatt treffer als boolean zu verwenden, habe ich treffer einfach als Zähler eingebaut, der bei einem erfolgreichen Vergleich eins hochzählt. Damit kann ich mir auch das break sparen. Jetzt funktioniert alles wie gewünscht.

    Sempervivum : Hilfreicher Tipp! Ich hab meinen Javascript-Horizont nun um ein paar Funktionen erweitert.


  • brina42 So geht's natürlich auch. Super, dass du deine eigene Methode gefunden hast.

    Ich hätte das wahrscheinlich so umgesetzt:

    JavaScript
    1. const words = [ '5g', 'strahlung', '5g-strahlung', 'auswirkung', 'auswirkungen', 'gefahr', 'gefahren', 'risiken', 'gesundheit', 'gesundheitliche', 'risiko', 'massenexperiment', 'elektrosmog',];
    2. const inputs = document.f1.v_45.value.trim().split(/[ ,]+/).map((input) => input.toLowerCase());
    3. const hits = words.filter((word) => inputs.includes(word.toLowerCase()));
    4. const hasAHit = hits.length > 0;
    5. const message = hasAHit
    6. ? 'Ausgezeichnet, wir haben einige Videos für Sie gefunden. Sie können nun auf Weiter klicken, um sich Ihre Suchergebnisse anzuschauen.'
    7. : 'Leider konnten wir zu Ihrem Suchbegriff keine Videos finden oder Sie haben Ihre Suche nicht ausreichend eingeschränkt. Versuchen Sie es noch einmal.';
    8. document.getElementById('infotext').innerHTML = message;