hawkmaster: Kleinster Value von select (multiple) finden

Hallo zusammen,
in einer Auswahlliste (select multiple) sind mehrere Werte markiert.
Ich möchte jetzt gerne bei einem Click herausfinden welches der kleinste markierte Value ist

Ich habe es vermutlich sehr umständlich so versucht:
Alle Einträge die markiert sind im Select (selelm) schreibe ich in ein Array.
Jetzt habe ich versucht mit der Math.min Funktion den kleinsten Wert zu finden.
Aber der alert bringt immer NaN;

  
	var spvalues_arr = new Array();  
	if(spdefault1 == false){  
		for(i=0;i<selelm.length;i++){  
			if(selelm.options[i].selected==true  ){  
				spvalues_arr[i] = selelm.options[i].value;  
			}  
		}  
	}  
	var mini = spvalues_arr;  
	for(i=0;i<selelm.length;i++){  
		mini = Math.min(selelm.options[i].value,mini);  
		  
	}  
	  
	alert(mini);  

was mache ich falsch, bzw. gibt es vielleicht eine elegantere Lösung?

vielen Dank und viele Grüße
hawk

  1. @@hawkmaster:

    nuqneH

    was mache ich falsch

    Lass dir mal 'typeof selelm.options[i].value' ausgeben.

    Qapla'

    --
    Bildung lässt sich nicht downloaden. (Günther Jauch)
    1. Hallo Gunnar, Hallo dedlfic,
      danke für eure Hinweise.

      Ich vermute ihr meint das die Values im Select ja strings sind.
      Also habe ich nun versucht die Values sowohl beim schreiben in das Select als auch nachher mit "parseInt()" umzuwandeln.

        
      	var spvalues_arr = new Array();  
      	if(spdefault1 == false){  
      		for(i=0;i<selelm.length;i++){  
      			if(selelm.options[i].selected==true  ){  
      				spvalues_arr[i] = parseInt(selelm.options[i].value);  
      			}  
      		}  
      	}  
      	var mini = spvalues_arr;  
      	for(i=0;i<selelm.length;i++){  
      		//alert(typeof selelm.options[i].value);  
      		mini = Math.min(parseInt(selelm.options[i].value),mini);  
      		  
      	}  
      	  
      	alert(mini);  
        
      
      

      leider kommt weiterhin die Ausgabe NaN

      vielen Dank und viele Grüße
      hawk

      1. echo $begrüßung;

        Ich vermute ihr meint das die Values im Select ja strings sind.
        [...] parseInt() [...]
        leider kommt weiterhin die Ausgabe NaN

        Vermute bitte nicht nur, überprüf deine Vermutung auch - mit Kontrollausgaben. Was konkret für ein Wert wird beanstandet?

        echo "$verabschiedung $name";

        1. Hallo dedlfix,

          Vermute bitte nicht nur, überprüf deine Vermutung auch - mit Kontrollausgaben. Was konkret für ein Wert wird beanstandet?

          na ich habe doch natürlich sofort auch überprüft :-)
          alert(typeof selelm.options[i].value);

          bringt mir in den For Schleifen immer "string". Daher dachte ich das man den Value mit "parseInt" umwandeln muss

          vielen Dank und viele Grüße
          hawk

          1. echo $begrüßung;

            alert(typeof selelm.options[i].value);
            bringt mir in den For Schleifen immer "string". Daher dachte ich das man den Value mit "parseInt" umwandeln muss

            Ok, soweit so gut. Wenn nun beim parseInt() ein NaN entsteht (direkt danach geprüft?), muss der Wert vorher nicht als Zahl interpretierbar sein. Ich weiß nicht, inwieweit parseInt auf Leerzeichen allergisch reagiert, aber Kommas wären ein Kandidat fürs Misslingen.

            echo "$verabschiedung $name";

  2. echo $begrüßung;

    Alle Einträge die markiert sind im Select (selelm) schreibe ich in ein Array.
    Jetzt habe ich versucht mit der Math.min Funktion den kleinsten Wert zu finden.
    Aber der alert bringt immer NaN;

    Lass dir den Typ der Elemente anzeigen, was mit dem typeof-Operator geht. Dann sollte dir auffallen, dass auch Select-Werte - wie sämtliche Formularwerte - [*]... sind, die erst noch umgewandelt (geparst) werden müssen.

    [*] Hier bitte Lösungswort einsetzen.

    echo "$verabschiedung $name";

  3. Hallo,

    in einer Auswahlliste (select multiple) sind mehrere Werte markiert.
    Ich möchte jetzt gerne bei einem Click herausfinden welches der kleinste markierte Value ist

    du meinst, zahlenmäßig der kleinste? - Das ergibt sich aus deinem Codeauszug, ist aber nicht selbstverständlich, weil die values ja nicht unbedingt Zahlenwerte sein müssen.

    Ich habe es vermutlich sehr umständlich so versucht:

    Allerdings. ;-)

    var spvalues_arr = new Array();
    if(spdefault1 == false){
    for(i=0;i<selelm.length;i++){

    Ich nehme an, selelm ist eine Referenz auf das select-Element? Dann überlege mal, ob das select-Elementobjekt selbst überhaupt eine length-Eigenschaft hat. Du meintest die Anzahl der options?
    Ergo: Die for-Schleife wird überhaupt nicht bearbeitet!

      	if(selelm.options[i].selected==true  ){  
    

    Warum nochmal explizit auf true vergleichen? if (selelm.options[i].selected) ist einfacher und verständlicher.

      		spvalues\_arr[i] = selelm.options[i].value;  
      	}  
      }  
    

    }
    var mini = spvalues_arr;

    Damit weist du mini ein Array zu. Ist das deine Absicht?

    for(i=0;i<selelm.length;i++){
    mini = Math.min(selelm.options[i].value,mini);
    }

    Und dann versuchst du mit Math.min quasi ein Array mit einem Zahlenwert zu vergleichen. Der indirekte Hinweis auf parseInt() war zwar von der Didaktik her gut, aber nicht notwendig. Javascript konvertiert Strings automatisch in Zahlenwerte, wenn der Kontext zwingend einen Zahlenwert verlangt.
    Dein Problem ist aber, dass das Array mini im ersten Schleifendurchlauf nicht in einen Zahlenwert konvertiert werden kann, Math.min() deshalb NaN zurückgibt. In allen weiteren Schleifendurchläufen ist eines der beiden Argumente von Math.min() wieder NaN, das Ergebnis mithin wiederum NaN.

    was mache ich falsch, bzw. gibt es vielleicht eine elegantere Lösung?

    Die option-Werte gibst du doch vor. Also weißt du auch mit Sicherheit, welcher Wert auf keinen Fall übeschritten werden kann. Initialisiere deshalb den min-Wert mit einem sehr großen Wert, der in deinen Daten nicht vorkommt.
    Dann läufst du *nur einmal* durch die option-Elemente und vergleichst in jedem Durchlauf das bisher ermittelte Minimum mit dem aktuellen Eintrag (Math.min ist da sicher kein falscher Ansatz), sofern er selektiert ist.
    Ist am Schleifenende der min-Wert immer noch größer als der größte erlaubte Wert, waren keine Einträge selektiert - hast du den Fall eigentlich bisher berücksichtigt?

    So long,
     Martin

    --
    "Hier steht, deutsche Wissenschaftler hätten es im Experiment geschafft, die Lichtgeschwindigkeit auf wenige Zentimeter pro Sekunde zu verringern." - "Toll. Steht da auch, wie sie es gemacht haben?" - "Sie haben den Lichtstrahl durch eine Behörde geleitet."
    1. Hallo Martin,

      herzlichen Dank für deine ausführliche Hilfe und Erklärung.

      Ergo: Die for-Schleife wird überhaupt nicht bearbeitet!

      doch, die schleife wird schon durchlaufen. Auch die Prüfung ob ein Wert selektiert wurde klappt.

      Damit weist du mini ein Array zu. Ist das deine Absicht?

      ja das war es :-)

      Also das Ganze sieht ungefähr so aus.
      Es gibt zwei Selects auf dem Form, wobei hier nur "sel_serviceproperties" eine Rolle spielt. In diesem Select werden die Options dynamisch erstellt durch eine Auswahld es ersten Selects.
      Ein Anwender soll jetzt die Möglichkeit haben, einen dieser Werte als "Standard" Wert festzulegen. Ich habe es so versucht, dass ich neben dem Select für jeden Eintrag ein Radio Button aufbaue der genau den gleichen Value hat.

        
       <select name="sel_serviceproperties[]" size="10" multiple="multiple"  onclick="check_sp_default_value(this,this.form.radio_serviceproperty_default);" >  
      <option value="4">Source1</option>  
      <option value="5">Source2</option>  
      </select>  
        
      <input type="radio" name="radio_serviceproperty_default" value="4" />  
      <input type="radio" name="radio_serviceproperty_default" value="5" />  
      
      

      Meine Überlegung war nun: Angenommen als Default Wert "radio_serviceproperty_default" was 5 festgelegt. Der Anwender möchte im "sel_serviceproperties" diesen Wert aber garnicht mehr. Dann soll automatisch der nächst kleinere Value als Default markiert werden.

      Daher mein vielleicht umständlicher Versuch :-)

      vielen Dank und viele Grüße
      hawk