Blitztabelle sortieren und wiedergeben
Freddy
- javascript
Hallo!
Ich habe eine Frage zu Javascript. Ich habe per HTML und JS eine Art Ticker für Fußball programmiert, wo die Tore der Teams stehen, die Punktzahl für meinen Tipp für jedes spiel angezeigt wird und eine Textarea, wo per prompt-Ausführung Torschützen usw. eingegeben werden können. Es ist alles in einer Tabelle sortiert, es ist für jedes Spiel eine Zeile dort mit zwei Textzeilen (Tore für Heim- bzw. Auswärtsteam), Punkte für den Tipp (ebvenfalls Textzeile) und ein Button.
Das ganze funktioniert so: bei einem Tor gebe ich den neuen Spielstand entsprechend für das Spiel ein und klicke auf den Button. Der startet die Funktionen, die den neuen Punktestand für das spiel berechnet und ein prompt-Fenster öffnet sich, wo ich Torschütze, Minute usw. eingebe und das ganze dann in eine Textarea unter der Tabelle geschreiben wird, jeweils mit Absatz nach einem Tor (wird untereinander aufgelistet).
Ich möchte nun eine Blitztabelle einbauen, die nach einem Klick auf den Button in eine Textarea eine Tabelle mit Platz, Teamname, Punkte, (Gegen-)Tore und Differenz wiedergibt. Ich habe schon so eine Ahnung, dass ich da am Besten irgendwas mit Arrays mache. Allerdings weiß ich nicht genau, wie.
Hatte mir überlegt, dass das mit einer FOR-Schleife gehen könnte, die dann nach und nach für jedes Team die Punkte ausliest (ggf. auch Tore bei Punktgleichheit) und dann immer weiter runter geht, bis die Punktzahl mal größer ist als die eines anderen Teams. Danach wird das nächste Team aufgerufen usw. und das ganze dann z.B. per "document.form.textarea.value=...." wiedergegeben.
Leider habe ich immer nur gute Ansätze, und wenn ich mich dann ran mache und das Script programmieren will fällt mir immer ein Fehler auf, der das ganze dann wieder den Bach runterfließen lässt.
Ich erhoffe mir nun hier Hilfe auf mein Problem. Ich hoffe, der lange Text hat euch nicht abgeschreckt, aber ich wollte lieber alles genau erklären, damit es keine Missverständnisse gibt.
MfG,
Freddy
Hallo Freddy,
Ich möchte nun eine Blitztabelle einbauen, die nach einem Klick auf den Button in eine Textarea eine Tabelle mit Platz, Teamname, Punkte, (Gegen-)Tore und Differenz wiedergibt. Ich habe schon so eine Ahnung, dass ich da am Besten irgendwas mit Arrays mache. Allerdings weiß ich nicht genau, wie.
Das würde ich mit einem zweidimensionalen Array machen. Vielleicht so:
var Tabelle=new Array();
for(var i=0;i<anzahl_teams;i++)
{
Tabelle[i]=new Array();
Tabelle[i][0]=Teamname;
Tabelle[i][1]=Punkte;
...
...
}
Das Array "Tabelle" kannst du dann sortieren, so wie du willst, indem du z.B. erst die zweiten Elemente vergleichst, und bei Gleichheit dann die dritten Elemente dazunimmst usw., die Sortierfunktion kannst du dir nämlich selber schreiben.
Tabelle.sort(mySortFunc);
function mySortFunc(a,b)
{
if(a[1]>b[1])
return 1;
else if(a[1]<b[1])
return -1;
else if(a[2]>b[2])
return 1;
else if(a[2]<b[2])
return -1;
else
return 0;
}
... so in der Art (eigentlich könnte man das viel kürzer schreiben). Die Sortierfunktion muss immer einen Wert zurückgeben; ist er positiv, wird a vor b eingeordnet usw. ...
Am Ende kannst du die neu sortierte Tabelle mit einer for-Schleife in eine Textarea oder sonstwohin ausgeben.
Grüße, Stefan
Danke! Hat mir sehr geholfen.
Dachte mir wie gesagt schon, dass das wohl am Besten mit Arrays zu lösen ist, wusste allerdings nicht egenau wie, da ich mit Arrays kaum Erfahrung hab.
War es aber bei zwei- bzw. mehrdimensionalen Arrays so, dass da einige Array-Funktionen wie eben sort() nicht funktionieren? Meine ich bei SelfHTML gelesen zu haben.....egal.
MfG,
Freddy
Hallo Freddy,
War es aber bei zwei- bzw. mehrdimensionalen Arrays so, dass da einige Array-Funktionen wie eben sort() nicht funktionieren? Meine ich bei SelfHTML gelesen zu haben.....egal.
Ich glaube, das verwechselst du mit den assoziativen Arrays. Die mehrdimensionalen lassen sich mit selbstdefinierten Funktionen ganz wunderbar sortieren, probier's einfach aus! Wichtig ist vielleicht noch, darauf zu achten, ob man Zahlen oder Zeichenketten sortiert, weil sonst ja "10" vor "9" einsortiert würde.
Grüße, Stefan
Hab das jetzt mal umbesetzt, es kommt immer eine Nachricht dass da ein Fehler ist, ausserdem wird überhaupt nix in die Textarea geschrieben. Formular- und Textareaname ist auf jeden Fall richtig!
Hier mal der Code (ohne die HTML-Sachen):
var tabelle=newArray();
for(var i=0;i<18;i++)
{
tabelle[0]=newArray();
tabelle[0][0]=FCB; //Teamname
tabelle[0][1]=22; //Punkte
tabelle[0][2]=27; //Tore
tabelle[0][3]=13; //Gegentore
tabelle[1]=newArray();
tabelle[1][0]=BVB;
tabelle[1][1]=19;
tabelle[1][2]=24;
tabelle[1][3]=17;
tabelle[2]=newArray;
tabelle[2][0]=HSV;
tabelle[2][1]=19;
tabelle[2][2]=23;
tabelle[2][3]=11;
}
tabelle.sort(sortieren);
function sortieren(a,b)
{
if(a[1]>b[1]){
return 1;
}else if(a[1]<b[1]){
return -1;
}else if(a[2]>b[2]){
return 1;
}else if(a[2]<b[2])
return -1;
}else{
return 0;
}
}
function schreiben()
{
var text="Man P T:GT Dif";
for(var i=0;i<18;i++)
{
text=tabelle[i][0]+" "+tabelle[i][1]+" "+tabelle[i][2]+":"+tabelle[i][3];
if(tabelle[i][2]-tabelle[i][3] == 0){
text=text+" 0";
return text;
}else if(tabelle[i][2]-tabelle[i][3] > 0){
text=text+" +"+(tabelle[i][2]-tabelle[i][3]);
return text;
}else if(tabelle[i][2]-tabelle[i][3] < 0){
text=text+" "+(tabelle[i][2]-tabelle[i][3]);
return text;
}
} //Ende for-Schleife
document.form.textarea.value=text;
} // Ende schreiben()
Hi Freddy,
Hab das jetzt mal umbesetzt, es kommt immer eine Nachricht dass da ein Fehler ist, ausserdem wird überhaupt nix in die Textarea geschrieben. Formular- und Textareaname ist auf jeden Fall richtig!
Hier mal der Code (ohne die HTML-Sachen):
var tabelle=newArray();
new Array();
for(var i=0;i<18;i++)
Das mit dem i hat natürlich nur Sinn, wenn du das i dann auch benutzt, z.B. beim Auslesen der Werte aus einer Tabelle. Das Auslesen muss doch sicher dynamisch passieren, da die Werte sich immer ändern können.
So, wie es jetzt hier steht, wird 18x genau dasselbe gemacht.
{
tabelle[0]=newArray();
new Array();
tabelle[0][0]=FCB; //Teamname
FCB ist eine Zeichenkette und muss in Anführungszeichen stehen, sonst wird eine Variable namens FCB gesucht, und wenn die nicht existiert, gibt es eine Fehlermeldung.
tabelle[0][1]=22; //Punkte
tabelle[0][2]=27; //Tore
tabelle[0][3]=13; //Gegentore
tabelle[1]=newArray();
tabelle[1][0]=BVB;
tabelle[1][1]=19;
tabelle[1][2]=24;
tabelle[1][3]=17;
tabelle[2]=newArray;
tabelle[2][0]=HSV;
tabelle[2][1]=19;
tabelle[2][2]=23;
tabelle[2][3]=11;
}tabelle.sort(sortieren);
function sortieren(a,b)
{
if(a[1]>b[1]){
return 1;
}else if(a[1]<b[1]){
return -1;}else if(a[2]>b[2]){
return 1;
}else if(a[2]<b[2])
return -1;}else{
return 0;
}
}
Klammern brauchst du nur, wenn in einem Zweig mehr als eine Anweisung steht.
function schreiben()
{
var text="Man P T:GT Dif";
for(var i=0;i<18;i++)
{
text=tabelle[i][0]+" "+tabelle[i][1]+" "+tabelle[i][2]+":"+tabelle[i][3];
if(tabelle[i][2]-tabelle[i][3] == 0){
text=text+" 0";
return text;
}else if(tabelle[i][2]-tabelle[i][3] > 0){
text=text+" +"+(tabelle[i][2]-tabelle[i][3]);
return text;
}else if(tabelle[i][2]-tabelle[i][3] < 0){
text=text+" "+(tabelle[i][2]-tabelle[i][3]);
return text;
}
} //Ende for-Schleife
document.form.textarea.value=text;
} // Ende schreiben()
Hmm, was du mit "return text;" willst, ist mir etwas schleierhaft. Vom Prinzip her würde ich es so machen:
function schreiben()
{
var ausgabe="";
for(var i=0;i<18;i++)
{
ausgabe+=tabelle[i][0]+" "+ ... +"\r\n"; // "\r\n"=Zeilenumbruch
}
document.form.textarea.value=ausgabe;
}
Grüße, Stefan
Das mit dem i hat natürlich nur Sinn, wenn du das i dann auch benutzt, z.B. beim Auslesen der Werte aus einer Tabelle. Das Auslesen muss doch sicher dynamisch passieren, da die Werte sich immer ändern können.
So, wie es jetzt hier steht, wird 18x genau dasselbe gemacht.
Ja, aber ich hab irgendwie ein Problem damit, vielleicht bion ich auch etwas beschränkt in meiner Vorstellungsweise...;-)
Also wie soll ich das machen? gut, die for-Schleife mit i. Wenn ich dann innerhalb der Schleife neue Arrays anlege und dann z.B. den Teamnamen haben will - WOHER SOLL ICH DEN NEHMEN? Würde ich folgendes schreiben:
tabelle[i]=newArray;
tabelle[i][0]="FCB"; // Teamname
dann würde doch JEDES Team letzendlich beim Index "0" den Wert FCB haben, oder nicht??? Korrigiere mich bitte (machst du wahrscheinlich sowieso...;-), wenn ich mich da irre.
Ja, dynamisch muss das sein. Aber wie dann? Kann ich dann folgendes schreiben:
tabelle[i][2]=document.form.tore[i].value // Tore
Also mit diesem tore[i], das irritiert mich irgendwie. Geht das denn?
Hatte mir erst überlegt, dass ich quasi 2 Arrays für EIN team mache. Das eine Array ändert sich nie, gibt nur die Grundbedingungen an, also Tore, Punkte,..... VOR dem Spieltag. Dann ein zweites, welches geändert werden kann, und als Grundlage eben dieses erste Array benutzt. Bei jedem Aufruf der Funktion wird dann das Array entsprechend neu geändert mit Punkten, Toren usw. und nachher sortiert.
Klammern brauchst du nur, wenn in einem Zweig mehr als eine Anweisung steht.
Klar, nur normalerweise mach ich das mit diesem Einrücken, wenn man z.B. eine Funktion startet sowieso nicht, darum brauche ich ETWAS, was mir die Orientierung erleichtert. Sonst blick ich da nicht mehr durch!
Hmm, was du mit "return text;" willst, ist mir etwas schleierhaft.
Dachte, dass es daran gelegen haben könnte. Hatte ich aus purer Verzweiflung gemacht, hat - natürlich - aber nix gebracht.
Vom Prinzip her würde ich es so machen:
function schreiben()
{
var ausgabe="";
for(var i=0;i<18;i++)
{
ausgabe+=tabelle[i][0]+" "+ ... +"\r\n"; // "\r\n"=Zeilenumbruch
}
document.form.textarea.value=ausgabe;
}
Klar, nur "kennt" der PC dann ausgabe? Hatte mal irgendwo gelesen, dass man das immer mit return machen muss, um den Wert in die nächste Ebene (also z.B. hier von for-Schelife nach Funktion) zu bekommen.
Man ist das alles ein Mist. Man siollte sich doch mal php angewöhnen.....;-)
MfG,
Freddy
Hallo Freddy,
Also wie soll ich das machen? gut, die for-Schleife mit i. Wenn ich dann innerhalb der Schleife neue Arrays anlege und dann z.B. den Teamnamen haben will - WOHER SOLL ICH DEN NEHMEN? Würde ich folgendes schreiben:
tabelle[i]=newArray;
new Array();
tabelle[i][0]="FCB"; // Teamname
dann würde doch JEDES Team letzendlich beim Index "0" den Wert FCB haben, oder nicht???
Stimmt.
Ich bin zuerst davon ausgegangen, dass sich die Tabelle mehrmals dynamisch ändert, so dass man sie immer wieder neu auslesen muss. Da wäre eine Schleife gut, und der Teamname wäre dann z.B der Inhalt des ersten <td> im i-ten <tr> der Tabelle.
Nun schreibst du unten aber, es gibt eine feste Ausgangssituation...
Dann kannst du das Ausgangs-Array natürlich auch gleich festlegen:
tabelle=new Array();
tabelle[0]=['team1',5,7,2,2,0];
tabelle[1]=['team2',2,6,2,0,1];
...
...
Ja, dynamisch muss das sein. Aber wie dann? Kann ich dann folgendes schreiben:
tabelle[i][2]=document.form.tore[i].value // Tore
Also mit diesem tore[i], das irritiert mich irgendwie. Geht das denn?
Keine Ahnung, was "tore" ist. Wenn es ein Formular "form" gibt und darin i+1 Felder mit dem Namen "tore", müsste das so gehen.
Hatte mir erst überlegt, dass ich quasi 2 Arrays für EIN team mache. Das eine Array ändert sich nie, gibt nur die Grundbedingungen an, also Tore, Punkte,..... VOR dem Spieltag. Dann ein zweites, welches geändert werden kann, und als Grundlage eben dieses erste Array benutzt. Bei jedem Aufruf der Funktion wird dann das Array entsprechend neu geändert mit Punkten, Toren usw. und nachher sortiert.
function schreiben()
{
var ausgabe="";
for(var i=0;i<18;i++)
{
ausgabe+=tabelle[i][0]+" "+ ... +"\r\n"; // "\r\n"=Zeilenumbruch
}
document.form.textarea.value=ausgabe;
}
Klar, nur "kennt" der PC dann ausgabe? Hatte mal irgendwo gelesen, dass man das immer mit return machen muss, um den Wert in die nächste Ebene (also z.B. hier von for-Schelife nach Funktion) zu bekommen.
ausgabe ist einfach nur eine Variable, die nach Durchlauf der Schleife 18 Zeilen enthält, und bis zum Ende der Funktion gültig ist.
Grüße, Stefan
Hallo,
schau mal hier rein, ob Du damit was anfangen kannst.
http://www.uni-muenster.de/Physik/DEK/FIP.html
Gruß, Jürgen