Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 15 von 16
  1. #1
    elbarto ist offline Grünschnabel
    registriert
    10-10-2013
    Beiträge
    5

    Problem mit Array und Push

    Guten Abend,

    ich bin ein Neuling in Sachen JavaScript und Web-Entwicklung generell. Komme eher aus der Java- und C#-Ecke.
    So bin ich über jeden Ratschlag froh, den ihr mir geben könnt. Vor allem wenn ich dabei bin mir einen schlechten Stil anzugewöhnen.

    Doch nun zu meinem eigentlichen Problem.

    Ich habe eine Klasse, die bestimmte Eckdaten eines Tages darstellt, hier ist jetzt nur die Info wichtig, welches genaue Datum ein Tag hat.
    Habe also ganz plump ein Array mit 365/366 Objekten wobei 0 für den 1.1. steht und das letzte für den 31.12.

    Wie nehme ich die Zuweisung vor?

    Ganz einfach, ich habe eine Schleife bis 365/366 nehme ein temporäres Objekt der obengenannten Klasse setze darin das Datum und fülle es dann per push in eine. Array der den ganze. Kalender darstellen soll.

    Die Einzelwerte des temporären Objekts sind okay, habe ich geprüft, trotzdem ist im Array jeder der 365/366 Einträge mit dem Wert 31.12. gefüllt.

    Hier das Coding:

    Code:
    function GlobalDate() {
    	this.ActDate = new Date();
    	this.WeekDay = "";
    	this.MatchdayLeague1 = new Matchday();
    	this.MatchdayLeague2 = new Matchday();
    	this.Happening = new DayHappening();
    }
    
    function UserDate() {
    	this.ActDate = new Date();
    	this.WeekDay = "";
    	this.MatchdayLeague1 = new Matchday();
    	this.MatchdayLeague2 = new Matchday();
    	this.Happening = new DayHappening();
    }
    
    function DayHappening()
    {
    	this.Happening = "";
    	this.HappeningDetail = "";
    	this.TeamID1 = -1;
    	this.TeamID2 = -1;
    	this.PlayerID = -1;
    }
    
    function createCalendar(year) {
    	var weekdays = new Array("Sonntag","Montag","Dienstag","Mittwoch","Donnerstag","Freitag","Samstag");
    	var startdate = new Date(year,1,1);
    	year += 1;
    	var globaldates = new Array();
    	var userdates = new Array();
    
    	// Prüfe, ob das angegebe Jahr ein Schaltjahr ist.
    	var plusyear = false;
    	if (year % 4 == 0)
    		plusyear = true;
    	if (year % 4 == 0 && year % 100 == 0)
    		plusyear = false;
    	if (year % 4 == 0 && year % 100 == 0 && year % 400 == 0)
    		plusyear = true;
    	var days = 365;
    	if (plusyear)	
    		days = 366;
    	
    	for (var i = 0; i < days; i++)
    	{
    		var global = new GlobalDate();
    		var user = new UserDate();
    		
    		startdate.setDate(startdate.getDate() + 1);		
    		global.ActDate = startdate;		
    		
    		user.ActDate = startdate;
    		global.WeekDay = weekdays[startdate.getDay()];
    		user.WeekDay = weekdays[startdate.getDay()];
    		globaldates.push(global);
    		userdates.push(user);
    	}
    
    	sessionStorage.setItem("globaldates",JSON.stringify(globaldates));
    	sessionStorage.setItem("userdates",JSON.stringify(userdates));			
    }
    Es scheint so, als gebe es ein Problem mit den Objektzuweisungen. Als würde das letzte Objekt über all bereits eingefügten Objekte im Array drübergebügelt.

    Habt ihr vielleicht einen Tipp oder eine Idee, was ich hier offensichtlich falsch gemacht habe?

  2. #2
    ein schlauer ist offline Lounge-Member
    registriert
    18-08-2004
    Beiträge
    14.671

    AW: Problem mit Array und Push

    Welcher Wert soll wo falsch sein?

  3. #3
    ein schlauer ist offline Lounge-Member
    registriert
    18-08-2004
    Beiträge
    14.671

    AW: Problem mit Array und Push

    Ach jetzt raff ich es.
    Code:
    	for (var i = 0; i < days; i++)
    	{
    		var global = new GlobalDate();
    		var user = new UserDate();
    		
    		startdate.setDate(startdate.getDate() + 1);		
    		global.ActDate = startdate;		
    		
    		user.ActDate = startdate;
    Du denkst hier wird eine tiefe Kopie angelegt?
    Nein! Bei jedem global ist .ActDate das gleiche Objekt startdate und letztlich ist dieser Wert in allen Objekten gleich.

  4. #4
    Avatar von kkapsner
    kkapsner ist offline Super Moderator
    registriert
    28-03-2008
    Beiträge
    17.677

    AW: Problem mit Array und Push

    NB: in JS gibt es keine Klassen.

    Dann hast du noch ein paar (Schönheits-)Fehler in deinem Code:
    1. sollte man den Array-Konstruktor lieber nicht verwenden, da er sich manchmal nicht so verhält, wie man es erwartet. Verwende lieber ein Arrayliteral:
    Code:
    ["Sonntag","Montag","Dienstag","Mittwoch","Donnerstag","Freitag","Samstag"]
    - ist auch noch etwas kürzer.
    2. Les' dir Doku zum Date-Konstruktor durch: https://developer.mozilla.org/en-US/...l_Objects/Date - der zweite Parameter erwischt die meisten auf dem falschen Fuß.
    3. Warum erhöhst du im Code das Jahr um eins? Das ergibt für mich keinen Sinn...
    4. Ob man sich in einem Schaltjahr befindet kann man viel einfacher feststellen:
    Code:
    var isLeap = (new Date(year, 1, 29)).getDate() === 29;
    5. Vergleiche macht man in JS besser mit "===", da "==" in JS nicht transitiv ist und manchmal extrem komische Resultate erzeugt:
    Code:
    alert(" \t\n\r" == 0);
    6. Man sollte prinzipiell (auch in Java ocder C++) nach if, else, while, etc. einen Block machen, da eine Einrückungen hier (anders als in Python) nicht die Zugehörigkeit festlegt. So können Fehler wie z.B.
    Code:
    if (...)
    	Anweisung1();
    	Answeisung2(); // das sollte eigentlich auf vom if abhängen, tut es aber nicht.
    gar nicht entstehen. (Es hat mich jetzt wirklich Überwindung gekostet, die geschweiften Klammern nicht zu schreiben - das ist bei mir schon extrem drin...)
    7. Date-Objekte können zwar in JSON.stringify() gefüttert werden und erzeugen auch eine sinnvolle Ausgabe, ABER mit JSON.parse() wird daraus nicht wieder ein Date-Objekt.

    EDIT: 8. Die öffnenden geschweiften Klammern eines Blockes sollten in JS nicht in einer neuen Zeile stehen.
    Geändert von kkapsner (11-10-2013 um 13:16 Uhr)

  5. #5
    Avatar von Dormilich
    Dormilich ist offline Kaiser
    registriert
    15-01-2010
    Beiträge
    1.289

    AW: Problem mit Array und Push

    Zitat Zitat von kkapsner Beitrag anzeigen
    EDIT: 8. Die öffnenden geschweiften Klammern eines Blockes sollten in JS nicht in einer neuen Zeile stehen.
    z.B. deswegen:
    Code:
    function test() {
      return
      {
        foo: "bar"
      }
    }
    
    console.log( test() );
    // expected: { foo: "bar" }
    // received: undefined
    Stichwort: Automatische Semikolon-Vervollständigung

  6. #6
    elbarto ist offline Grünschnabel
    registriert
    10-10-2013
    Beiträge
    5

    AW: Problem mit Array und Push

    @kkapsner

    vielen Dank für deine Ratschläge

    Zu 2)

    Ja, ich weiß, gilt von 0 - 11. Habe ich gestern Abend schlicht nicht auf dem Schirm gehabt.

    Zu 3)

    Na ja, eigentlich setze ich für den Kalender einen Zeitraum von 01.07.XX - 30.06.XX + 1 voraus, habe es aber vorher angepasst, um das Problem einfacher darzustellen.
    Diese letzte Anpassung ist mir durchgegangen.

    Zu 6) und 8)

    Gut, ich werde versuchen es zu beherzigen. Wobei ich bei 6 ohnehin dann Klammern verwende, wenn ich weiß, dass mehr als eine Anweisung durchgeführt werden soll.

    @ein Schlauer

    Argh, klar...
    In JS gibt es den Befehl "copy" zum kopieren des Wertes eines Objektes, oder spricht etwas gegen diesen Befehl in diesem Zusammenhang?

    Mensch, es ärgert mich, dass ich das nicht selbst schon beim Schreiben gemerkt habe, ist ja in vielen anderen Sprachen auch so...

    Danke jedenfalls, da fällt es einem doch wie Schuppen von den Augen...

    Gruß

    El Barto

  7. #7
    Avatar von Dormilich
    Dormilich ist offline Kaiser
    registriert
    15-01-2010
    Beiträge
    1.289

    AW: Problem mit Array und Push

    Zitat Zitat von elbarto Beitrag anzeigen
    In JS gibt es den Befehl "copy" zum kopieren des Wertes eines Objektes, oder spricht etwas gegen diesen Befehl in diesem Zusammenhang?
    der wäre mir neu, daß es so einen Befehl gibt. (und er ist auch in keiner JS Doku zu finden).

  8. #8
    elbarto ist offline Grünschnabel
    registriert
    10-10-2013
    Beiträge
    5

    AW: Problem mit Array und Push

    @Dormilich

    Du hast recht, was hatte ich da nur im Sinn?
    Nach kurzem googeln stellt sich für mich heraus, dass mehrere (und wohl unschöne) Wege gibt, Tiefenkopien anzulegen.

    Hättest du einen Ratschlag wie man es machen kann und noch vielmehr auf keinen Fall tun sollte?

  9. #9
    Avatar von Dormilich
    Dormilich ist offline Kaiser
    registriert
    15-01-2010
    Beiträge
    1.289

    AW: Problem mit Array und Push

    Naja, es kommt darauf an, was für Objekte du kopieren willst, bzw. (um es genauer zu sagen) ob die Objekte zyklische Referenzen haben (z.B. haben alle DOM-Objekte zyklische Referenzen).

    Weiterhin stellt sich die Frage, ob es immer notwendig ist, ein deep-clone durchzuführen. Zudem besitzen etliche native Objekte eigene clone(-äquivalente)-Methoden (Node.clone(), Array.concat(), Array.slice()). Zudem gibt es properties, die man ohnehin nicht klonen sollte (prototype).

  10. #10
    tsseh ist offline Foren-Gott
    registriert
    19-05-2008
    Beiträge
    5.642

    AW: Problem mit Array und Push

    na du legst einfach immer ein neues objekt an und verwendest nicht jedesmal das selbe

  11. #11
    Avatar von kkapsner
    kkapsner ist offline Super Moderator
    registriert
    28-03-2008
    Beiträge
    17.677

    AW: Problem mit Array und Push

    Beim Date-Objekt geht das "clonen" extrem einfach:
    Code:
    var d = new Date();
    var d2 = new Date(d);
    d.setFullYear(2000);
    console.log(d);
    console.log(d2);

  12. #12
    elbarto ist offline Grünschnabel
    registriert
    10-10-2013
    Beiträge
    5

    AW: Problem mit Array und Push

    Danke an euch alle.
    Läuft jetzt so, wie ich es möchte.

    Und sorry für die eigentlich dämliche Eingangsfrage, hätte ich selbst drauf kommen müssen...

    Gruß

    El Barto

  13. #13
    Avatar von Dormilich
    Dormilich ist offline Kaiser
    registriert
    15-01-2010
    Beiträge
    1.289

    AW: Problem mit Array und Push

    Apropos Eingangsfrage, Properties und Methoden von Objekten sollten immer klein- und Konstruktoren immer großgeschrieben werden (zur besseren Unterscheidung, da im Nachhinein nicht mehr feststellbar ist, ob eine Funktion/Methode eines Objekts als Konstruktor verwendet werden kann oder nicht)

  14. #14
    Avatar von kkapsner
    kkapsner ist offline Super Moderator
    registriert
    28-03-2008
    Beiträge
    17.677

    AW: Problem mit Array und Push

    Am besten lässt du mal jslint oder jshint über deinen Code laufen...

  15. #15
    elbarto ist offline Grünschnabel
    registriert
    10-10-2013
    Beiträge
    5

    AW: Problem mit Array und Push

    @kkapsner

    Werde ich machen, Ist ja im Aptana Studio integriert.

    Welchen Vorteil außer den in [1] genannten Punkten habe ich z.B. von jslint noch?

    Gruß

    El Barto

    1: Javascript use strict

Seite 1 von 2 12 LetzteLetzte

Ähnliche Themen

  1. Antworten: 11
    Letzter Beitrag: 05-09-2013, 13:28
  2. Antworten: 5
    Letzter Beitrag: 09-05-2012, 13:26
  3. php-Array nach Javascript-Array Problem
    Von dtrixer im Forum JavaScript
    Antworten: 4
    Letzter Beitrag: 16-03-2010, 17:18
  4. push elements aus document zu array und summe
    Von aazmitia im Forum JavaScript
    Antworten: 0
    Letzter Beitrag: 18-07-2007, 12:33

Stichworte

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •