Mehrere Arrays sortieren!

NinjaOne

Erfahrenes Mitglied
Hallo,
ich habe 4 Arrays die zusammenhängend sortiert werden sollen.
Ich habe zb Array Vorname, Array Nachname usw.
Nun möchte ich zb alle Arrays nach Nachnamen sortieren wie kann ich das machen?
Wenn ich mit sort das Nachnamen Array sortiere hab ich nicht mehr die richtigen Vornamen.
Ich hoffe ich habe mich verständlich ausgedrückt und freue mich schon auf eure Antworten.
Würde mich auch über ein kleines Beispiel freuen.
Danke.

PHP:
var Vorname=new Array("Dirk","Otto","Mike");
var Nachnem=new Array("Zimmermann","Schulz","Duli");
var Strasse=new Array("Steinstr.","Holzhauserstr.","Bremerstr.");

Nachname.sort();
 
Der Umgang ist mit Arraysit in JS recht unkomfortabel.... so gibt es z.B. keine echten assoziativen Arrays, welche man da in anderen Sprachen verwenden würde.

Hier mal eine Möglichkeit, wie das Sortieren in deinem Fall doch gehen würde:
Code:
<script type="text/javascript">
<!--
function multisort()
{
  args = multisort.arguments;
  arrTmp=[];
  for(i = 0;i<args.length;++i)
    {
      arrTmp[i] = [args[0][i],args[1][i],args[2][i]];
    }
  arrTmp.sort();
  for(i=0;i<arrTmp.length;++i)
    {
      for(j=0;j<arrTmp[i].length;++j)
        {
          args[j][i]=arrTmp[i][j];
        }
    }
    //testen
    document.write(Nachname.join(',')+'<br>'+Vorname.join(',')+'<br>'+Strasse.join(','));
}

var Vorname=new Array("Dirk","Otto","Mike");
var Nachname=new Array("Zimmermann","Schulz","Duli");
var Strasse=new Array("Steinstr.","Holzhauserstr.","Bremerstr.");

//Die betreffenden Arrays als Parameter...
//der zu sortierende Array als erster
multisort(Nachname, Vorname, Strasse);

//-->
</script>
...
Es wird ein Hilfsarray erstellt, indem die Elemente anders vorliegen(Nachname, Vorname, Strasse)
Dieser Array wird dann sortiert... und nochmals durchlaufen, wobei die ursprünglichen Arrays in der sortierten Reihenfolge neu gefüllt werden.
 
Hmm... steigt da nicht der Sortieraufwand exponentiell mit der Array-Größe? Wäre mal interessant da ein Merge-Sort oder Quick-Sort drauf zu implementieren.
 
Danke,
ich habe es so eingebaut und es klappt super.
Hab da nur noch ein Problem wenn ich Zahlen sortieren will.

PHP:
var Vorname=new Array("Dirk","Otto","Mike");
var Nachname=new Array("Zimmermann","Schulz","Duli");
var Nummer=new Array(17,9,20);

multisort(Nummer,Nachname, Vorname);

Das geht leider nicht.
Ich weiss dass man Zahlen mit so sortiert :
PHP:
function Numsort (a, b) {
            return a - b;
}

Nummer.sort(Numsort);

Aber wie kann ich das in der Neue function multisort() machen ?
Zumal die function ja auch herausfinden muss was sie gerade sortiert.

Würd mich freuen, wenn ihr mir das noch erklären könntet.
Danke.
 
Hi,

ein Versuch, die Idee mit Quicksort von @con-f-use aufzugreifen und das Script auch für Zahlen nutzbar zu machen.
Code:
var arrTmp = new Array();

function sortIt(){
  arrArgs = sortIt.arguments;

  for(i=0; i<arrArgs[0].length; i++){
    arrTmp[i] = new Array();
    for(j=0; j<arrArgs.length; j++)
      arrTmp[i][j] = arrArgs[j][i];
  }

  quicksort(0, (arrArgs[0].length-1));

  for(i=0;i<arrTmp[0].length;++i){
    for(j=0;j<arrTmp.length;++j)
      arrArgs[i][j]=arrTmp[j][i];
  }

  // Testen
  strOut = "";
  for(i=0; i<arrArgs.length; i++){
    strOut += arrArgs[i].join("; ") + "<br />";
  }
  document.write(strOut);
}

function quicksort(intLower, intUpper){
  var i = intLower, j = intUpper;
  var varHelp = new Array();
  // Teilen des Bereiches und Vergleichswert ermitteln
  var varX = arrTmp[parseInt(Math.floor(intLower+intUpper)/2)][0];

  // 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(arrTmp[i][0] < varX)
    i++;
    // Solange Wert im rechten Teil grösser ist -> Grenzindex dekrementieren
    while(varX < arrTmp[j][0])
    	j--;

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

  // Quicksort rekursiv aufrufen
  if(intLower < j) quicksort(intLower, j);
  if(i < intUpper) quicksort(i, intUpper);
}

var Vorname = new Array("Dirk", "Otto", "Mike", "Peter");
var Nachname = new Array("Zimmermann", "Schulz", "Duli", "Grosse, der");
var Strasse = new Array("Steinstr.", "Holzhauserstr.", "Bremerstr.", "Kreml");
var Zahlen = new Array(1980, 1970, 1960, 1672);

//Die betreffenden Arrays als Parameter...
//der zu sortierende Array als erster
sortIt(Zahlen, Nachname, Vorname, Strasse);
Ciao
Quaese
 

Neue Beiträge

Zurück