effel: Array-Elemente nach Typ auswerten

Hallo!

Ich arbeite mit Arrays, die sowohl Zahlen als auch Zeichenketten enthalten: z.B.

var arr1=[]
arr1=['4','5','mm','8'];

alle Array-Elemente sind zunächst Zeichenketten, dann möchte ich mit den Zahlen rechnen und die ZK('mm') auswerten, brauche also eine Funktion, die den Typ, der aus dem Array-Element entsteht, erkennt. Alle versuche mit "undefined" und "typeof" sind gescheitert. Mit der brachialen Funktion:

Z0=0
while (Z0 < ein1.length){
if((ein1[Z0]%2==0)||(ein1[Z0]%2==1)){
ANZ1[Z0]= 1*ein1[Z0]     //Zahlen             
  }else{
MM1=ein1[Z0]             //Srings
  }
Z0=Z0+1;
   }

Gibt es nicht eine elegantere Lösung?

Es grüßt Effel

  1. var arr1=[] arr1=['4','5','mm','8'] alle Array-Elemente sind zunächst Zeichenketten, dann möchte ich mit den Zahlen rechnen und die ZK('mm') auswerten, brauche also eine Funktion, die den Typ, der aus dem Array-Element entsteht, erkennt.

    setze einfach

    var arr1 = [ 4, 5, 'mm', 8 ];
    

    Dann liefert typeof, was Du erwartest. So wie Du es gemacht hast, sind es Strings.

    Ein anderer Trick geht so:

    v = 'E';
    if ( Number.isNaN( v * 1 ) ) {
        console.log("Hehe: Text");
    } else {
        console.log("Hehe: Zahl");    
    }
    

    Literatur: JS: Number (MDN)

    Und noch eine Bitte: Kannst Du auf Antwort mit Zitat verfassen klicken und nachsehen, wie ich den Quelltext notiert habe? Oder in der Hilfe? Wir hatten das doch schon mal - oder irre ich mich?

  2. Hi,

    Ich arbeite mit Arrays, die sowohl Zahlen als auch Zeichenketten enthalten:

    ich kenne die Programmiersprache "Zu diesem Forum", die Du als Schlagwort ausgewählt hast, nicht. 😉

    Ohne Kenntnis der verwendeten Programmiersprache wird's schwierig …

    cu,
    Andreas a/k/a MudGuard

  3. Hallo effel,

    ich habe deinen Code mal als Code markiert, damit man wenigstens ein bisschen lesen kann. Und ich nehme an, dass Raketenwilli deinen Code korrekt als JavaScript erraten hat und habe den Beitrag entsprechend getaggt.

    Wenn Du die Chance hast, deine Zahlen als Zahlen zu speichern, dann tu das. Dann funktioniert typeof.

    Die von Raketenwilli notierte Abfrage Number.isNaN(arr[i]*1) sieht merkwürdig aus, aber die Sache mit der Zahlenerkennung ist tatsächlich nicht so einfach.

    • parseInt würde auch "3a" als Zahl liefern, nämlich 3
    • Es gibt zwei isNaN Funktionen: eine globale und (seit ECMAScript 2015) auch eine isNaN Methode am Number Objekt. Da man auf den IE keine Rücksicht mehr nehmen muss, kann man die verwenden, ohne Polyfills im Hintergrund halten zu müssen.
    • Problem der globalen isNaN Funktion: sie wandelt ihr Argument zuerst in eine Zahl um. Jeder falsy-Wert (0, "", false, null) wird zu 0 umgewandelt und würde deshalb als Zahl erkannt werden. Das mag ok für Dich sein - keine Ahnung.
    • Number.isNaN prüft dagegen exakt auf den NaN Wert (Not A Number - ein spezieller Wert in JavaScript für Rechenergebnisse, die nicht numerisch sind). Wenn Du arr[i] mit 1 multiplizierst, fordert das JavaScript auf, das Array-Element zunächst in eine Zahl zu konvertieren. Das geschieht nicht mit parseInt oder parseFloat, sondern durch Einsatz von Number als Funktion, und dieser Aufruf ist sehr strikt. Leerzeichen vorn und hinten sind ok, aber jedes andere falsche Zeichen erzeugt den NaN Wert.

    Das funktioniert zwar, ist aber nicht 100% klar. Eine klarere Formulierung ist aus meiner Sicht der Test isNaN(Number(arr[i])). Damit wird das Array-Element explizit in eine Zahl konvertiert, das Ergebnis ist entweder eine gültige Zahl (dann liefert isNaN false) oder eben NaN und dann liefert isNaN true. Andererseits spricht auch nichts gegen einen typeof Test, nachdem Du den Wert mit Number versuchsweise konvertiert hast.

    Also so:

    let num = Number(arr[i]);
    if (typeof(num) == 'number'
       // Als Zahl verarbeiten
    } 
    else {
       // Als String verarbeiten
    }
    

    oder so

    let num = Number(arr[i]);
    if (!isNaN(num)) {
       // Als Zahl verarbeiten
    } 
    else {
       // Als String verarbeiten
    }
    

    Im zweiten Beispiel könnte man den then und else Teil auch vertauschen, um den Not-Operator weglassen zu können.

    Rolf

    --
    sumpsi - posui - obstruxi
    1. Erstmal vielen Dank !

      Ich werde mich intensiv mit den Antworten beschäftigen. Das dauert aber!

      Wenn ich noch Fragen habe, werde ich mich später melden.

      Gruß Effel

    2. Hallo Rolf!

      Es funktioniert! Habe meine ganzen Programme umgemoddelt und es läuft gut

      Besten Dank - auch an die anderen Schreiber

      Gruß Effel