Manuel: String in Array finden

Hallo!
Ich möchte als Bedingung in einer if-Schleife die Überprüfung angeben, ob ein String in einem Array vorhanden ist.
Eine vergleichbare Abfrage in Delphi würde z.B. lauten:
if (string IN var) then ...

kurz: ich habe ein Array mit Zahlen und eine Variable die eine Zahl enthält und wenn diese Zahl auch im Array vorhanden ist, soll true zurückgegeben werden. Oder vergleichbare Lösung...

Vielen Dank, sollte eigentlich leicht sein.
gruss, manu

  1. Hallo Manuel.

    Ich möchte als Bedingung in einer if-Schleife die Überprüfung angeben, ob ein String in einem Array vorhanden ist.

    Schau dir mal die String-Funktionen an (insbesondere indexOf):
    http://de.selfhtml.org/javascript/objekte/string.htm

    Damit vergleichst du die Werte deines Arrays, wird etwas gefunden, liefert indexOf die Position des Treffers, ansonsten -1.

    Freundschaft!
    Siechfred

    --
    Punk's not dead: http://www.siechfreds-welt.de/badreligion.shtml
    Dankbarkeit, man spürt sie ja so selten bei den Menschen, und gerade die Dankbarsten finden nicht den Ausdruck dafür, sie schweigen verwirrt, sie schämen sich und tun manchmal stockig, um ihr Gefühl zu verbergen. (Stefan Zweig)
    1. Danke für die Antwort!
      Daran habe ich auch schon gedacht, aber da die Überprüfung in einem Alpha-Betha Algorithmus vorkommt, kann ich mir nicht so viele Überprüfungen leisten, dass ich jedes Element des Arrays einzeln mit dem String vergleiche. Diese Überprüfung wird nämlich mehrere 100mal oder 1000mal durchgeführt und würde dabei die Rechenzeit erhöhen.
      Ich benötige keine Teiluntersuchung, sondern lediglich die exakte Übereinstimmung zwischen dem String und einem einzigen Feld im Array. Also ob der String im Array enthalten ist oder nicht.
      Gruss, manu

      1. Ich benötige keine Teiluntersuchung, sondern lediglich die exakte Übereinstimmung zwischen dem String und einem einzigen Feld im Array. Also ob der String im Array enthalten ist oder nicht.

        Was ist eine Teiluntersuchung? Bzw. ist das was anderes als eine exakte Übereinstimmung?

        So wie deine Frage klingt, ist die einfachste Möglichkeit für jedes Element durch dein Array iterieren und zu vergleichen.

        Oder du machst ein join ('') und prüfst dann mit indexOf

        function check(wert, array)
        {
        var tmp = array.join('');
        return tmp.indexOf(wert);
        }

        Struppi.

        1. Hallo Struppi!
          Teiluntersuchung: str ist in string enthalten
          Exakte Übereinstimmung: string = string

          Entschuldige die unverständliche Ausdrucksweise.

          Die Lösung mit Join gefällt mir recht gut. Hast du Erfahrungen, ob das schneller ist, als die Schleife mit Einzelüberprüfungen(s.o.)?
          Leider befürchte ich, dass es Probleme gibt, wenn ich als Variable 1 habe und im Array z.B. ne 10 steht :/ Dann würde er das ja als gefunden zurückgeben...

          Gruss, manu

          1. Die Lösung mit Join gefällt mir recht gut. Hast du Erfahrungen, ob das schneller ist, als die Schleife mit Einzelüberprüfungen(s.o.)?
            Leider befürchte ich, dass es Probleme gibt, wenn ich als Variable 1 habe und im Array z.B. ne 10 steht :/ Dann würde er das ja als gefunden zurückgeben...

            so sieht's aus. Was für dich am sinnvollsten ist läßt sich letztendlich nur sagen wenn man weiß wie das Array aussieht und wofür es verwendet wird. Ein assoziatives Array in der Form (nicht wie selfhtml beschrieben, die Benutzung von Array ist nicht zu empfehlen):

            var x = new Object();

            x['attr_1'] = 1;
            x['attr_2'] = 1;

            ist auf jeden Fall wesentlich schneller und für viele Zwecke auch die optimale Lösung.

            Struppi.

      2. Hallo Manuel.

        Daran habe ich auch schon gedacht, aber da die Überprüfung in einem Alpha-Betha Algorithmus vorkommt, kann ich mir nicht so viele Überprüfungen leisten, dass ich jedes Element des Arrays einzeln mit dem String vergleiche. Diese Überprüfung wird nämlich mehrere 100mal oder 1000mal durchgeführt und würde dabei die Rechenzeit erhöhen.

        Mag sein, aber mit Javascript kommst du anders nicht zum Ziel. Es sei denn, du wandelst den gesamten Array mit Hilfe von join in einen String um und wendest auf diesen String indexOf an:
        http://de.selfhtml.org/javascript/objekte/array.htm#join

        Ich benötige keine Teiluntersuchung, sondern lediglich die exakte Übereinstimmung zwischen dem String und einem einzigen Feld im Array. Also ob der String im Array enthalten ist oder nicht.

        Dazu musst du aber das Array Element für Element durchgehen, es sei denn, du kennst die Indexnummer des relevanten Elements, dann kannst du natürlich gleich sowas machen:

        (dein_array[nummer] == "Dein String") ? return True : return False;

        Freundschaft!
        Siechfred

        --
        Punk's not dead: http://www.siechfreds-welt.de/badreligion.shtml
        Dankbarkeit, man spürt sie ja so selten bei den Menschen, und gerade die Dankbarsten finden nicht den Ausdruck dafür, sie schweigen verwirrt, sie schämen sich und tun manchmal stockig, um ihr Gefühl zu verbergen. (Stefan Zweig)
    2. Hello,

      was hältst Du denn von assoziativen Arrays?
      http://de.selfhtml.org/javascript/objekte/array.htm#assoziative_arrays

      Da kannst Du dann gleich nachfragen, ob das Element unter diesem Namen angeleget ist und die Suche in der Variablen-Definitionsliste wird von JavaScript selbst vorgenommen.

      Liebe Grüße aus http://www.braunschweig.de

      Tom

      --
      Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
      Nur selber lernen macht schlau
      1. Hi Tom!
        Bin gerade dabei, mich darin einzulesen. Allerdings befinden sich in meinem einige Zahlen zwischen 1 und 64 und läuft eine Schleife (x=1;x<=64;x++) durch, die prüft, ob der Laufindex x im Array enthalten ist.
        Ob dann die Namensgebung für die Arrayfelder sinnvoll ist, weiß ich noch nicht, weil so auch das anlegen des Array aufwendiger wird.
        Gruss,manu

        1. gruss Manuel, hi Tom

          was hältst Du denn von assoziativen Arrays?
          http://de.selfhtml.org/javascript/objekte/array.htm#assoziative_arrays

          Da kannst Du dann gleich nachfragen, ob das Element unter diesem Namen angeleget ist
          und die Suche in der Variablen-Definitionsliste wird von JavaScript selbst vorgenommen.

          Liebe Grüße aus http://www.braunschweig.de

          Tom

          wenn iteration vermieden werden soll, ist dieser
             ansatz der einzig moegliche, gleichzeitig moechte
             ich aber einige langlebige missverstaendnisse aus
             dem weg raeumen:

          "in javascript gibt es keine 'assoziativen arrays'!"

          "jedes dennoch im javascript-kontext auftauchende
              'assoziative array' wurde brutal vergewaltigt!"

          _das_ist_so_ : warum ist das so?

          konstrukte der art ...

          var assocArr = new Arr();
             assocArr["keyName01"] = "something";
             assocArr["keyName02"] = "something else";
             ...
                  missbrauchen den Array-konstruktor, da hier
             offensichtlich "nur" ein einfaches objekt mit ein
             paar eigenschaften erzeugt werden soll - weder die
             eigenschaft "length" noch die array-methoden, ueber
             die ein array-objekt verfuegen kann, werden von einer
             solchen chimaere jemals benoetigt - deswegen bitte so:

          var simpleObj = new Object();
             simpleObj.propName01 = "something";
             simpleObj.propName02 = "something else";

          oder aber zur dynamischen erzeugung von objekt-eigenschaften
             bzw. fuer ehemalige "assoziative straftaeter":

          var simpleObj = {}; // {} literal fuer new Object();
             simpleObj["propName01"] = "something";
             simpleObj["propName02"] = "something else";

          oder aber kuerzer als objekt-literal:

          var simpleObj = {
               propName01: "something",
               propName02: "something else"
             };

          bzw.:

          var simpleObj = {
               "propName01": "something",
               "propName02": "something else"
             };

          wobei die vorvorletzte und die zuletzt aufgezeigte variante
             jeweils die moeglichkeit bieten, namen fuer objekteigenschaften
             zu verwenden, welche die namenskonvention fuer variablen verletzen
             wuerden (leerzeichen, sonderzeichen etc.);

          ende teil 1:

          ---------

          teil 2:

          Bin gerade dabei, mich darin einzulesen. Allerdings befinden sich in meinem einige Zahlen
          zwischen 1 und 64 und läuft eine Schleife (x=1;x<=64;x++) durch, die prüft, ob der Laufindex
          x im Array enthalten ist.
          Ob dann die Namensgebung für die Arrayfelder sinnvoll ist, weiß ich noch nicht, weil so auch
          das anlegen des Array aufwendiger wird.

          Gruss,manu

          @manu:

          nachdem Du teil 1 gelesen hast, sollte dir
             folgendes kommentierte beispiel weiterhelfen:

          var testStr = "something special";
             var testArr = [
               1234,
               "hi",
               9876,
               "04",
               testStr
             ];
             var keyNames = function() {
               var i, obj = {};
               for (i=0; i<testArr.length; i++) {
               //alle eintraege aus "testArr" werden
               //boolsche eigenschaften des objekts
               //"obj" mit dem wert [true];
                 obj[testArr[i].toString()] = true;
               }
               return obj;
             }(); /* keyNames ist jetzt ein objekt
             welches zur schnellpruefung auf werte
             aus dem array "testArr" herangezogen
             werden kann, ohne das fuer jeden test
             dieses array erst durchlaufen werden
             muss; */

          alert("keyNames:\n\n" + ((typeof keyNames.toSource == "function") ? (keyNames.toSource()) : (keyNames)));

          function isInTestArr(str) { // schnelltest;
               return ((keyNames[str] === true) ? (true) : (false));
             }

          alert("isInTestArr:\n\n1234 : " + isInTestArr(1234) +
             "\n"hi" : " + isInTestArr("hi") + "\n9876 : " +
             isInTestArr(9876) + "\n"04" : " + isInTestArr("04") +
             "\n"" + testStr + "" : " + isInTestArr(testStr) +
             "\n\n"something else" : " + isInTestArr("something else"));

          by(t)e by(t)e - peterS. - pseliger@gmx.net

          --
          sh:| fo:) ch:? rl:| br:& n3:} n4:# ie:| mo:{ va:| de:[ zu:] fl:) ss:) ls:& js:)
          1. Hello,

            danke Peter, das war sehr aufschlussreich und kommt gleich in Doku-Sammlung

            Liebe Grüße aus http://www.braunschweig.de

            Tom

            --
            Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
            Nur selber lernen macht schlau
          2. Hallo Peter,

            gleichzeitig moechte ich aber einige langlebige missverstaendnisse aus dem weg raeumen:
            "in javascript gibt es keine 'assoziativen arrays'!"
            "jedes dennoch im javascript-kontext auftauchende 'assoziative array' wurde brutal vergewaltigt!"
            _das_ist_so_
            [...]

            Hm, wolltest du die Missverständnisse nicht widerlegen statt sie zu bestätigen ;-)

            Freundschaft!
            Siechfred

            --
            Punk's not dead: http://www.siechfreds-welt.de/badreligion.shtml
            Dankbarkeit, man spürt sie ja so selten bei den Menschen, und gerade die Dankbarsten finden nicht den Ausdruck dafür, sie schweigen verwirrt, sie schämen sich und tun manchmal stockig, um ihr Gefühl zu verbergen. (Stefan Zweig)
            1. gruss Siechfred,

              Hm, wolltest du die Missverständnisse nicht widerlegen
              statt sie zu bestätigen ;-)

              Du hast recht - also nochmal:

              "in javascript gibt es keine 'assoziativen arrays'!" : _das_ist_so_

              "jedes dennoch im javascript-kontext auftauchende 'assoziative
                  array' wurde brutal vergewaltigt!" : _das_ist_ungehoerig_so_

              ausserdem moechte ich wortreich darauf aufmerksam machen,
                 dass ich 'assoziatives array' geschrieben habe, was meine
                 ablehnende haltung gegenueber diesem begriffe unterstreichen
                 sollte ;-)

              Freundschaft!
              Siechfred

              mahlzeit - peterS. - pseliger@gmx.net

              --
              sh:| fo:) ch:? rl:| br:& n3:} n4:# ie:| mo:{ va:| de:[ zu:] fl:) ss:) ls:& js:)
      2. Hallo Tom.

        was hältst Du denn von assoziativen Arrays?
        http://de.selfhtml.org/javascript/objekte/array.htm#assoziative_arrays

        Meinst du es so:

        var mein_array = new Array();
        mein_array[0] = new Array();
        mein_array[0]["Wert1"] = "Wert 1";
        mein_array[0]["Wert2"] = "Wert 2";
        mein_array[0]["Wert3"] = "Wert 3";

        und dann sowas:

        ("Wert2" in mein_array) ? return True : Return False;

        Das geht nicht, du kannst so nicht auf das Array zugreifen. Was jedoch IMHO gehen sollte, wäre:

        (mein_array[0].Wert2) ? return True : return False;

        Ist jetzt die Frage, ob es wirklich sinnvoll ist, das vorliegende Array in ein assoziatives Array umzuwandeln, da kann man es auch gleich elementweise durchgehen und vergleichen. Oder man baut sich ein neues Objekt mit den jeweiligen Eigenschaften:

        var mein_array {
                        Wert1 : 'Wert 1',
                        Wert2 : 'Wert 2',
                        Wert3 : 'Wert 2'
                       }

        dann geht es auch so:

        (mein_array.gesuchterWert) ? return True : return False;

        Aber irgendwie erscheint mir das alles zu aufwändig, es sei denn, ich liege wieder mal völlig daneben ;-)

        Freundschaft!
        Siechfred

        --
        Punk's not dead: http://www.siechfreds-welt.de/badreligion.shtml
        Dankbarkeit, man spürt sie ja so selten bei den Menschen, und gerade die Dankbarsten finden nicht den Ausdruck dafür, sie schweigen verwirrt, sie schämen sich und tun manchmal stockig, um ihr Gefühl zu verbergen. (Stefan Zweig)
  2. hi,
    ich würde das so machen, ist glaube ich auch die typische Vorgehensweise.

    for(var i=0;i<array.length;i++)
     if(array[schleifenindex]==string) return true;

    ich hoffe das konnte helfen
    -lambach

    1. Hello,

      ich würde das so machen, ist glaube ich auch die typische Vorgehensweise.

      for(var i=0;i<array.length;i++)
       if(array[schleifenindex]==string) return true;

      "return" kann man nur zum Verlassen eines Blockes (Funktion) verwenden, nicht aber mitten in einer Sequenz oder Schleifen, wenn der Block (die Funktion, das Programm) noch weiter ausgeführt werden soll.

      Liebe Grüße aus http://www.braunschweig.de

      Tom

      --
      Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
      Nur selber lernen macht schlau