roger: doppelten Eintrag in Auswahlmenü (select-option) verhindern.

Hallo,

ich erzeuge aus einer Liste einige Auswahlmenüs (select - option)
Meine Liste (Array) lautet z.B. (Liste bekomme ich vorgegeben)

liste[0][0] = "NameW"
liste[0][1] = "0"
liste[0][2] = "100"
liste[1][0] = "NameX"
liste[1][1] = "0"
liste[1][2] = "100"
liste[2][0] = "NameY"
liste[2][1] = "0"
liste[2][2] = "200"
liste[3][0] = "NameZ"
liste[3][1] = "10"
liste[3][2] = "100"

Ich erzeuge nun 3 Auswahlmenüs
1. id=Name
2. id=min
3. id=max

Danach erzeuge ich über eine Schleife die benötigen "option"en und fülle diese mit den Daten.

Nun habe ich aber manchmal die gleichen Werte mehrmals im Auswahlmenü.
z.B.
liste[0][1] = "0" und liste[1][1] = "0"
oder
liste[1][2] = "100" und liste[3][2] = "100"

Die würde aber einfach reichen.... und viel besser aussehen.
Wie kann ich beim erzeugen des Auswahlmenüs abfragen ob der neue Wert schon vorhanden ist ??
Kann ich irgendwie, wie in einem String, das Auswahlmenü (auf einmal) abfragen ob der "neue Wert" (den ich eintragen will) schon im Menü vorhanden ist ?
Mit Schleife und alle Einträge abklappern ist klar, aber das muss doch noch einfacher gehen.

Gruß
        roger

  1. Hallo,

    Wie kann ich beim erzeugen des Auswahlmenüs abfragen ob der neue Wert schon vorhanden ist ??
    Kann ich irgendwie, wie in einem String, das Auswahlmenü (auf einmal) abfragen ob der "neue Wert" (den ich eintragen will) schon im Menü vorhanden ist ?
    Mit Schleife und alle Einträge abklappern ist klar, aber das muss doch noch einfacher gehen.

    Ohne Schleife kannst du meines Wissens in den select.options nicht direkt feststellen, ob ein Wert schon existiert.

    Aber du könntest jeden neu einzutragenden option.value in ein Array setzen, und dieses Array jedesmal vorher checken, ob ein Wert nicht bereits drinsteht (d.h. als Option schon existiert). Das geht ab Javascript 1.6 mit Array.indexof().

    Für JavaScript < 1.6 findest du dort einen Workaround.

    Gruß, Don P

    1. Hallo,

      mit "indexof()" funktioniert es super.... jedoch nur unter aktuellem Firefox. Unter Konqueror 3.5.8 und Explorer 6 funktioniert es nicht.
      Woher weiß ich welcher Browser welche Javascript Version am laufen hat ??

      Mit dem Link "Javascript 1.6" komme ich auch nicht klar, ich verstehe überhaupt nicht was "<script type="text/javascript"; e4x=1>" bringen soll ??

      Es kann natürlich auch sein, das ich auf der Leitung sitze.
      Bitte um einen Anstoß und/oder Tip

      Gruß
               roger

      1. Hallo,

        Woher weiß ich welcher Browser welche Javascript Version am laufen hat ??

        Mit dem Link "Javascript 1.6" komme ich auch nicht klar, ich verstehe überhaupt nicht was "<script type="text/javascript"; e4x=1>" bringen soll ??

        Das weiß ich leider alles auch nicht so genau. Bin auch zum Lernen hier :-). Jedenfalls könnstest du die im Artikel Array.indexof() genannte Funktion einbinden, um auch früheren javascript-Versionen die Array.indexOf()-Methode beizubringen.

        Ich würde dir aber raten, den von plan_B vorgeschlagenen Weg zu gehen. Das scheint mir eleganter, weil du dann kein separates Array anlegen und evtl. wieder leeren bzw. entsorgen musst. Außerdem wird dieser Weg auch von älteren javascript-Versionen unterstützt.

        Es ist aber noch ein kleinen Fehler in seiner for-Zeile. Ich würde das Ganze notieren:

          
        // Zuerst ein min-Select erstellen mit Namen  
        // Zuerst ein max-Select erstellen mit Namen  
        // dann die Optionen wie folgt hinzufügen:  
          
        for (var i=0, l=liste.length, minExists={}, maxExists={} ; i<l; i++) {  
          
          var wert = liste[i][1];  
          
          if ( !minExists[wert] ) {  
          
             // ...hier neue min-Option mit dem wert zum min-Feld hinzufügen...  
          
             minExists[wert] = true;  // Merker setzen, dass der Wert schon existiert  
          }  
          
          var wert = liste[i][2];  
          
          if ( !maxExists[wert] ) {  
          
             // ...hier neue max-Option  mit dem wert zum max-Feld hinzufügen...  
          
             maxExists[wert] = true;  // Merker setzen, dass der Wert schon existiert  
          }  
        }
        

        Gruß, Don P

  2. Hallo,

    Mit Schleife und alle Einträge abklappern ist klar, aber das muss doch noch einfacher gehen.

    du könntest dir parallel ein temp. Objekt erzeugen, mit dem min- bzw. max-Wert als key

      
    for (var i=0,ie=liste.length, tmp_min={}, tmp_max{} ; i<ie; i++) {  
      
      // neue Option erstellen mit Namen  
      
      var wert1 = liste[i][1];  
      if ( ! tmp_min[wert1] ) {  
         // neue Option erstellen mit wert1  
         tmp_min[wert1] = true;  // Merker  
        }  
      var wert2 = liste[i][2];  
      if ( ! tmp_max[wert2] ) {  
         // neue Option erstellen mit wert2  
         tmp_max[wert2] = true;  // Merker  
        }  
      }  
    
    

    Gruß plan_B

    --
         *®*´¯`·.¸¸.·