Javascript zweidimensionales Array sortieren

pchilfe

Erfahrenes Mitglied
Liebe Freunde,

Ich möchte ein zweidimensionales Array sortieren. Das Array besteht aus zwei Spalten und 40 Zeilen:
Code:
Spalte(1): Arr[i][0]: Alter
Spalte(2): Arr[i][1]: Namen
Ich möchte das Array nach dem Alter sortieren und den Namen entsprechend ausgeben:
Meine Idee ist die Spalte Alter in einem Array Brr zu extrahieren, sortieren und dann durchsuche ich das Array Arr und gebe den Namen entsprechend dem Brr Array aus.

Dafür habe folgendes gemacht:

Function zum Zahlen sortieren:
HTML:
function ZahlenSort(a, b){
    if(a!='' && b!=''){
       return a - b;
       }
    }

Extrahiere die Alter Spalte in einem Array Brr:
HTML:
var Brr = new Array();
for(i=0; i<Arr.length; i++){ // Da das Array Arr leere zellen enthält
 if((Arr[i][0]!='' && Arr[i][1]!='') || (Arr[i][0]!='undefined' && Arr[i][1]!='undefined')){
     Brr[i] = Arr[i][0];
   }
 }

Zahlen Sortieren:
HTML:
var Brr = Brr.sort(ZahlenSort);

hier will ich anhand dem Array Brr das Array Arr durchsuchen und die Spalte Namen ausgeben:

HTML:
           var Crr = new Array();
           
           for(var i=0; i<=Brr.length; i++){
              if(Brr[i] !='' && Brr[i]!='undefined'){   // Da das Array leere Zellen enthält
              
                for(var j=0; j<=Arr.length; j++){
                   if(Arr[j][0]!='' && Arr[j][0]!='undefined'){  // Da das Array leere Zellen enthält
                      if(Brr[i]==Arr[j][0]){
                         Crr[i] = Arr[j][1];     //<--- Hier ist das problem
                        Arr[j][0]="n";   // Element gefunden wird in Crr gespeichert und mit n ersetzt
                      }
                    }
                  }
               }
            }


Mein Problem ist: an der Stelle
Code:
Crr[i] = Arr[j][1];
meldet der Internet Explorer
Code:
den Fehler: '0' is Null oder kein Objekt. FireFox: Arr[j] has no properties.

Kann jemand mir hilfen oder ein andere Möglichkeit geben zweidimensionales Array zu sortieren.

Vielen Dank im Vorraus.
 
Zuletzt bearbeitet:
Hi,

Du könntest das Arrayobjekt um eine Methode erweitern, die das Sortieren nach der Spaltennummer (beginnend bei 0) ermöglicht.
Code:
/* ****************************************************************************** *
 * Arrayobjekt um Methode erweitern - Array nach Spalten sortieren
 *
 * Parameter: intCol - Spalte, nach der sortiert werden soll (beginnend bei 0)
 * ****************************************************************************** */
Array.prototype.sortAsc = function(intCol){
  if(intCol >= this.length) return;

  for(var i=0; i<this.length-1; i++){
    for(var j=(i+1); j<this.length; j++){
      // Falls das aktuelle Element grösser ist -> tauschen
      if(this[j][intCol] < this[i][intCol]){
        var arrHelp = this[i];
        this[i] = this[j];
        this[j] = arrHelp;
      }
    }
  }
}

var arrPerson = new Array(["Adam", 20], ["Bernd", 16], ["Xaver", 23], ["Matthias", 44], ["Joachim", 31]);
arrPerson.sortAsc(1);  // 0 = nacch Name sortieren, 1 = nach Alter sortieren
Ciao
Quaese
 
Wobei das ein recht ungünstiger Sortieralgorithmus ist. Es braucht n²/2 Vergleiche (n ist die Zeilenzahl des Arrays). Es gibt sicher irgentwo bei Google eine Quicksort-, Merge- oder Bubblesort-Impementation, die das ganze mit weniger Rechneleistung und stabil in place macht.
 
Hi,

wobei die Komplexität von Bubblesort ebenfalls n² ist und das Prinzip, dass das kleinste Element in einem
Durchlauf an den Anfang "gespült" wird, das gleiche wie beim verwendeten Algorithmus ist. Nur wird beim
Bubblesort paarweise und von hinten nach vorn verglichen.

Mergesort würde ich in Anbetracht der hier vorliegenden geringen Datenmenge (40 Datensätze) ebenfalls
nicht verwenden.

Eine Quicksort-Implementierung könnte wie folgt aussehen:
Code:
/* ****************************************************************************** *
 * Arrayobjekt um Methode erweitern - Array mit Quicksort nach Spalten sortieren
 *
 * Parameter: intLower - Untergrenze des Teilbereichs (beim Start i.A. 0)
 *            intUpper - Obergrenze des Teilbereichs (beim Start i.A. Array.length-1)
 *            intCol   - Spalte, nach der sortiert werden soll (beginnend bei 0)
 * ****************************************************************************** */
Array.prototype.quicksortCol = function(intLower, intUpper, intCol){
  var i = intLower, j = intUpper;
  var varHelp = new Array();
  // Teilen des Bereiches und Vergleichswert ermitteln
  var varX = this[parseInt(Math.floor(intLower+intUpper)/2)][intCol];

  // Teilbereiche bearbeiten bis:
  // - "linker" Bereich enthält alle "kleineren" Werte
  // - "rechter" Bereich enthält alle "grösseren" Werte
  do{
    // Solange Wert im linken Teil kleiner ist -> Grenzeindex inkrementieren
    while(this[i][intCol] < varX) i++;
    // Solange Wert im rechten Teil grösser ist -> Grenzindex dekrementieren
    while(varX < this[j][intCol]) j--;

    // Untergrenze kleiner als Obergrenze -> Tausch notwendig
    if(i<=j){
      var varHelp = this[i];
      this[i] = this[j];
      this[j] = varHelp;
      i++;
      j--;
    }
  }while(i<j);

  // Quicksort rekursiv aufrufen
  if(intLower < j) this.quicksortCol(intLower, j, intCol);
  if(i < intUpper)  this.quicksortCol(i, intUpper, intCol);
}

// Beispiel: Array mit Quicksort nach Spalten sortieren
var arrPerson = new Array(["Adam", 20], ["Bernd", 16], ["Xaver", 23], ["Matthias", 44], ["Joachim", 31]);
arrPerson.quicksortCol(0, (arrPerson.length-1), 1);
Ciao
Quaese
 
Zurück