mehrdim. assoziatives Array sortieren
Tobias
- javascript
0 Axel Richter0 Tobias
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
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
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