Tobias: mehrdim. assoziatives Array sortieren

Hi, irgendwie bekomm ich es nicht hin. ich habe ein mehrdim. Assoz. Array und möchte dies sortieren. Die einfache Methode array.sort() funzt irgendwie nicht. Rufe ich array.sort() das erste Mal auf, dann wird absteigend sortiert, rufe ich array.sort() ein zweites mal auf wird aufsteigend sortiert. Und immer so weiter im Wechsel. Das darf natürlich nicht sein ;)

bsp: array[1]["text"] = "Cäsar" array[1]["value"] = 3 array[2]["text"] = "Anton" array[2]["value"] = 7 array[3]["text"] = "Michaela" array[3]["value"] = 1

ich möchte nun nach "text" sortieren. Also soll es hinterher so aussehen:

array[2]["text"] = "Anton" array[2]["value"] = 7 array[1]["text"] = "Cäsar" array[1]["value"] = 3 array[3]["text"] = "Michaela" array[3]["value"] = 1

wie kann ich verfahren? Irgendwelche Ideen?

Tobias

  1. Hallo,

    irgendwie bekomm ich es nicht hin.
    ich habe ein mehrdim. Assoz. Array und möchte dies sortieren.
    Die einfache Methode array.sort() funzt irgendwie nicht.

    Der Methode Array.sort() kann man eine Funktion als parameter übergeben, welche dann für spezielle Sortierungsaufgaben zuständig ist. Das ist hier http://selfhtml.teamone.de/javascript/objekte/array.htm#sort relativ ausführlich beschrieben.

    Folgendes Beispiel erschlägt Deine Aufgabenstellung und sortiert sogar, bei gleichen Texten nach den Values.

    function sortText(a,b) {
     alert(a["text"]+a["value"] + "<->" + b["text"]+b["value"]);
     var index = 0;
     if (a["text"] == b["text"]) index = a["value"] - b["value"];
     else if (a["text"] > b["text"]) index = 1;
     else if (a["text"] < b["text"]) index = -1;
     return index;
    }

    var a = new Array();
    a[0] = new Array();
    a[0]["text"] = "Cäsar"
    a[0]["value"] = 3
    a[1] = new Array();
    a[1]["text"] = "Anton"
    a[1]["value"] = 7
    a[2] = new Array();
    a[2]["text"] = "Michaela"
    a[2]["value"] = 3
    a[3] = new Array();
    a[3]["text"] = "Michaela"
    a[3]["value"] = 2
    a[4] = new Array();
    a[4]["text"] = "Michaela"
    a[4]["value"] = 1
    a[5] = new Array();
    a[5]["text"] = "Bertram"
    a[5]["value"] = 1
    for (var i = 0; i<a.length; i++) {
      document.write(a[i]["text"] + ": " + a[i]["value"] + "<br>");
    }
    document.write("<hr>");
    a.sort(sortText);
    for (var i = 0; i<a.length; i++) {
      document.write(a[i]["text"] + ": " + a[i]["value"] + "<br>");
    }

    viele Grüße

    Axel

    1. Danke das war jetzt wirklich seeeeehr ausführlich. Habe mich zunächst einmal mit folgender Lösung beholfen. Denke ich werde es nach deiner Methode wieder umbauen.

      function sort(obj){  var sortieren = new Array();  var list = new Array();  var i;

      // Liste in ein Array lesen  for (i=0; i < obj.options.length; i++) {    list[i] = new Array();    list[i]["text"] = obj.options[i].text;    list[i]["value"] = obj.options[i].value;  }

      // umsortieren in ein eindimensionales Array  for (i=0; i < obj.length; i++){    sortieren[i]=list[i]["text"]+";"+list[i]["value"];  }

      // eigentliches sortieren  sortieren.sort();

      // sortiertes Array wieder zurück in das Listenarray zurücklesen  for (i=0; i < sortieren.length; i++) {    var felder = sortieren[i].split(";");    list[i]["text"] = felder[0];    list[i]["value"] = felder[1];  }

      // Listenfeld löschen  this.eraseList(obj);

      // sortiertes Listenarray in das Listenobjekt einfügen  for (i=0; i < list.length; i++){    this.addOption(obj, list[i]["value"], list[i]["text"]);  } }

      Wobei die Funtion zu einer Javascriptklasse gehört. Obj ist dabei eine Select-Liste

      grüsse Tobias