Zur Navigation

Tabelle sortieren [2]

11 Jörg Kruse

Die Zahlen sind nur Beispiele für das, was in den Spalten stehen könnte und wonach du sortieren möchtest. Es ging mir erstmal darum, dass du siehst, wie so ein zweidimensionales Array aufgebaut sein muss

Das Array selbst würde ich in einer Schleife aufbauen

Als erstes ermittelst du hierzu die Anzahl der Zeilen:

var Anzahl = document.getElementById("Tabelle2").childNodes.length;
Unsortiert = new Array();

Dann kommt die Schleife, die du bei 1 beginnst, damit die Header-Reihe nicht mit sortiert wird

for (var i = 1; i <= Anzahl; i++) {
    Unsortiert[i - 1] = new Array();
    Unsortiert[i - 1]['Inhalt'] = document.getElementById("Tabelle2").childNodes[i];
    Unsortiert[i - 1]['Wert'] = document.getElementById("Tabelle2").childNodes[i].childNodes[Spalte].innerHTML;
}

Die Variable "Spalte" ist hierbei die Ordnungszahl der Spalte, die du der Sortier-Funktion übergibst.

Das ist alles ungetestet - aber so in etwa würde ich versuchen vorzugehen

24.08.2010 23:18 | geändert: 24.08.2010 23:20

12 Jerry02

hab ich damit jetzt schon alle zeilen der Tabelle in einem array gespeichert? also die, die ich vor dem sortieren noch erstelle?

25.08.2010 08:45

13 Jerry02

achso ich verstehe ich muss das für jede spalte einzeln machen und immer die ordnungszahl der spalte ersetzen. ich dachte das geht alles in einem rutsch :)
also zum beispiel für WKN Sortieren weil WKN in der ersten spalte steht:

		var Anzahl = document.getElementById("Tabelle2").childNodes.length;
		Unsortiert = nwe Array();
		for (var i = 1 <= Anzahl; i++) {
			Unsortiert[i - 1] = new Array();
			Unsortiert[i - 1]['Inhalt'] = document.getElementById("Tabelle2").childNodes[i];
			Unsortiert[i - 1]['Wert'] = document.getElementById("Tabelle2").childNodes[i].childNodes[0].innerHTML;


Edit: Also so wie ich das jetzt verstanden habe muss ich für jede neue sortierung eine neue Funktion schreiben also z.B. für WKN die function WKNSort oder für Name dann NameSort und dort wid dann immer das von dir oben angegebene eingefügt mit dem wert der zu sortierenden spalte und darunter noch die sortierfunktion? und dann muss die neue Tabelle ja noch ausgegeben werden dass müsste dan quasi auch noch extra in jede funktion? oder hab ich da etwas völlig falsch verstanden?

25.08.2010 08:46 | geändert: 25.08.2010 09:23

14 Jerry02

Nochmal Edit:

also das müsste quasi das array mit der sortierfunktion für die namen, welche in der 2. spalte der tabelle stehen so aussehen:

function NameSortieren ()

	{
		funcrion Numsort
		var Anzahl = document.getElementById("Tabelle2").childNodes.length;
		Unsortiert = nwe Array();
		for (var i = 1 <= Anzahl; i++) {
			Unsortiert[i - 1] = new Array();
			Unsortiert[i - 1]['Inhalt'] = document.getElementById("Tabelle2").childNodes[i];
			Unsortiert[i - 1]['Wert'] = document.getElementById("Tabelle2").childNodes[i].childNodes[1].innerHTML;
		Unsortiert[i - 1].sort();
	}

ist das einigermaßen richtig so? und wie kann ich dieses sortierte array jetzt wieder als tabelle ausgeben bzw. es muss ja die Tabelle unter dem formular ersatzen bzw. überschreiben.

25.08.2010 09:49

15 Jörg Kruse

Es reicht eine Funktion, der du die Spaltennummer als Argument übergibst

function TabelleSortieren (Spalte)

Dann benötigst du noch eine Funktion, die du sort() übergibst, so wie in dem SELFHTML-Thread beschrieben, damit die Zeilen nach dem Spaltenwert sortiert werden, also nach dem jeweils zweiten Array-Element

Wenn das Array neu sortiert ist, kann man die Zeilen in einer Schleife wieder in die Tabelle einbauen

25.08.2010 10:01

16 Jerry02

ok so weit hab ich das einigermaßen verstanden, nur möchte ich ja nicht nur eine spalte sortieren, sondern einmal wenn ich auf WKN in der Tabellenkopfzeile klicke möchte ich die tabelle nach WKN sortieren, wenn ich dann auf Name klicke, möchte ich die tabelle nach namen sortieren. da gibt es doch mehrere spaltennummern oder hab ich jetzt nen denkfehler?

25.08.2010 10:06

17 Jörg Kruse

In den Funktionsaufrufen übergibst du die Spaltennummer (beginnend mit 0), z.B.:

<a href="#" onclick="TabelleSortieren(0)">nach Spalte 1 sortieren</a>

<a href="#" onclick="TabelleSortieren(2)">nach Spalte 3 sortieren</a>

25.08.2010 10:13

18 Jerry02

ok glaub das versteh ich jetzt! ich versuch das jetzt alles mal! wenn ich nicht weiter komme frage ich einfach Jörgs Forum ;)
in anderen foren wurde ich nur abgewiesen!
echt jetzt du bist der einzige, der mir wirklich helfen will, ok ob es dir spaß macht einem anfänger alles zu erklären ist fraglich aber du machst es einfach, das finde ich super! ich kann mich nicht oft genug bedanken!

25.08.2010 10:24

19 Jerry02

also du meinst ja mit sicherheit das ich das so machen soll wie hier beschrieben:

<script type="text/javascript">
function mySort(a, b)
{
    return a[4] > b[4] ? 1 :
    a[4] < b[4] ? -1 :
    0;
}
var z = [
["Achsnich", "Agnes", "", "Bahnhofstr.", "214"],
["Achsnich", "Agnes", "", "Bahnhofstr.", "206"],
["Achsnich", "Agnes", "", "Bahnhofstr.", "204"],
["Achsnich", "Agnes", "", "Bahnhofstr.", "201"]
];
var new_arr = z.sort(mySort);
alert(new_arr.join('\n'));
</script>

ist jetzt die function MySort(a, b) die selbe funktion wie meine function TabelleSortieren(0, 1, 2, 3, 4, 5)?
wenn ja was soll ich denn daraus machen:

{
    return a[4] > b[4] ? 1 :
    a[4] < b[4] ? -1 :
    0;
}

Tut mir leid für die ganze Fragerei!

Edit: Ich habe noch eine Frage: bei dem Begriff childNodes im Array soll ich ja die nummer der spalte eingeben. Wie mache ich das? ganz einfach so: childNodes[0, 1, 2, 3, 4, 5] oder nur immer eine?

25.08.2010 10:55 | geändert: 25.08.2010 11:47

20 Jörg Kruse

ist jetzt die function MySort(a, b) die selbe funktion wie meine function TabelleSortieren(0, 1, 2, 3, 4, 5)

Nein, das ist eine weitere Funktion, die du sort() als Argument übergibst, damit sort() weiß, wie und wonach es sortieren soll. Du musst die Funktion noch auf dein Array anpassen, so dass sie sich nicht auf a[4] etc. sondern auf a['Wert'] etc. bezieht

Edit: Ich habe noch eine Frage: bei dem Begriff childNodes im Array soll ich ja die nummer der spalte eingeben. Wie mache ich das? ganz einfach so: childNodes[0, 1, 2, 3, 4, 5] oder anders?

So wie ich das in Beitrag 11 geschrieben habe: "childNodes[Spalte]" - die Variable "Spalte" übergibst du ja als Argument der Funktion (siehe Beitrag 15)

25.08.2010 11:46 | geändert: 25.08.2010 11:49