BigTomcio: Sort

Hallo!

ich möchte Hausnummern mit Zussatz sortieren. Diese liegen in eimem Array, allerdings in folgender Form: z.B. 12a@021254
Das vor dem "@" ist die hausnummer.

Diese Version Sortiert es Korrekt, allerdings komischerweise nur jedes zweite mal. Der String ist hier testweise immer der gleiche, also kann ich mir nicht erklären warum dieses phänomen auftitt.

hier mein code:

var str = new Array("12@2424523","3@423234","12a@2366","32a@2363","124@64576");

function hnrSort(a,b) {
  a = a.substring(0,a.indexOf("@"));
  b = b.substring(0,b.indexOf("@"));

if(a.match(/[a-zA-Z]/g) != null){
   a = a.substring(0,a.length-1);
  }
  if(b.match(/[a-zA-Z]/g) != null){
   b = b.substring(0,b.length-1);
  }
 return(a-b);
}

alert(str.sort(hnrSort));

  1. Hallo BigTomcio,

    ich konnte den Fehler nicht nachvollziehen (Opera, FF, IE); mgl.weise solltest Du explizit den Teilstring in eine Zahl umwandeln (parseInt), wobei ich mir das bei einer Subtraktion nicht vorstellen kann.

    Mit freundlichem Gruß
    Micha

  2. Hallo BigTomcio,

    Diese Version Sortiert es Korrekt, allerdings komischerweise nur jedes zweite mal. Der String ist hier testweise immer der gleiche, also kann ich mir nicht erklären warum dieses phänomen auftitt.

    und was bei dir passiert die anderen Male?
    Bei mir ist die Sache äußerst diffus: Im IE geht es nach etwa vier malen nicht. Es kommen verschiedene Javascriptfehler, z.B "Number expected" in der Zeile mit dem Aufruf oder "undefined is null or not an object" in der Zeile mit if(a.match..., im FF läuft es einwandfrei.

    Gruß, Jürgen

    PS hier mein geänderter Test. Die alerts zeigten, was zu erwarten war.

    var str = new Array("12@2424523","3@423234","12a@2366","32a@2363","124@64576");

    function hnrSort(a,b) {
    //alert("1 "+a+" "+str);
      a = a.substring(0,a.indexOf("@"));
      b = b.substring(0,b.indexOf("@"));
    //alert("2 "+a+" "+str);
      if(a.match(/[a-zA-Z]/g) != null){
       a = a.substring(0,a.length-1);
      }
      if(b.match(/[a-zA-Z]/g) != null){
       b = b.substring(0,b.length-1);
      }
    //alert("3 "+a+" "+str);
     return(a-b);
    }

    <button type="button" onclick="alert(str+'\n'+str.sort(hnrSort)+'\n'+str)">Klick</button>
    <button type="button" onclick="alert(str.sort(hnrSort))">Klick</button>

  3. seltsam!
    leider muss ich das im IE zum laufen bringen. Ich hoffe mir kann jemand helfen, das zum laufen zu bringen.

    zusätzlich ist mir noch beim testen mit vielen hausnummern aufgefallen, dass bei gleichen hausnummern mit unterschiedlichen zusätzen diese durcheinander sortiert werden, z.b. 12f, 12c, 12a, usw.
    hat jemand ne idee?

    Danke im voraus.
    Gruß
    BigTomcio

    1. Hallo BigTomcio,

      seltsam!
      leider muss ich das im IE zum laufen bringen. Ich hoffe mir kann jemand helfen, das zum laufen zu bringen.

      das ergibt sich vieleicht von allein ...

      zusätzlich ist mir noch beim testen mit vielen hausnummern aufgefallen, dass bei gleichen hausnummern mit unterschiedlichen zusätzen diese durcheinander sortiert werden, z.b. 12f, 12c, 12a, usw.
      hat jemand ne idee?

      das liegt an deiner Vergleichsfunktion, die ja die Buchstaben ausblendet. Ich würde den Vergleich auf Stringbasis durchführen und die Hausnummern vorn mit Nullen auffüllen, so das sie alle gleich viele Stellen haben. Also

      12a@... -> 000012a@...
      123@... -> 000123@...

      Dann wieder ab @ abschneiden und danach vergleichen mit > oder <.

      außerdem würde ich a und b vor dem Anpassen in lokale Variablen umspeichern. Vieleicht liegt dein Problem ja daran, dass du die Übergabeparameter verändert hast, u.A. auch deren Länge.

      Alternativ könntest du den Vergleich auch auf Zahlenbasis durchführen wie in der jetzigen Version, und bei Gleichheit entscheidet der Buchstabe.

      Gruß, Jürgen

    2. zusätzlich ist mir noch beim testen mit vielen hausnummern aufgefallen, dass bei gleichen hausnummern mit unterschiedlichen zusätzen diese durcheinander sortiert werden, z.b. 12f, 12c, 12a, usw.
      hat jemand ne idee?

      Das wird ein bisschen komplizierter:

      var str = new Array("12@2424523","3@423234","12a@2366","32a@2363","124@64576");  
      function hnrSort(a,b) {  
       var a1 = frmHnr(a);  
       var b1 = frmHnr(b);  
       return a1[0] > b1[0] ? 1 :  
       a1[0] < b1[0] ? -1 :  
       a1[1] > b1[1] ? 1 :  
       a1[1] < b1[1] ? -1 :  
       0;  
        
      }  
      function frmHnr(nr) {  
       var parts = nr.split('@');  
       var x = (parts[0].match(/[a-zA-Z]/g) != null)  
        ?  
        parts[0].substring(parts[0].length - 1)  
        :  
        ''  
       ;  
       return [parseInt(parts[0]), x];  
      }  
      alert(str.sort(hnrSort).join('\n'));
      

      Das geht vermutlich auch performanter, aber ich bin heute zu Faul zum Denken ;-)

      Struppi.

  4. Hallo!

    Hi!

    Ein sehr seltsames Problem.
    Der folgende Code funktioniert bei mir:

      
    function hnrSort(a,b) {  
      var a2 = a.substring(0,a.indexOf("@"));  
      var b2 = b.substring(0,b.indexOf("@"));  
      if(a2.match(/[a-zA-Z]/g) != null){  
       a2 = a2.substring(0,a2.length-1);  
      }  
      if(b2.match(/[a-zA-Z]/g) != null){  
       b2= b2.substring(0,b2.length-1);  
      }  
     return(a2-b2);  
    }  
    
    

    Offenbar liegt das Problem aber bei der substring-Funktion, die in den gleichen String wieder reinschreiben muss.
    Aber frag mich nicht, warum dass das manchmal geht und manchmal nicht.

    Filmtipp für heute:
    Kill Bill

    *grins* und schönen Abend
    nam

    1. Super!
      Danke, So funktioniert es. Da fällt mir ein stein vom herzen.

      Gruß
      BigTomcio