00willson: Arrays und .push()

Guten Abend.

Ich hab ein Problem mit dem Hinzufügen von Elementen zu Arrays und hoffe, Ihr könnt mir vielleicht weiterhelfen.

Ich definiere einen eigenen Datentypen, den ich später mit Formulardaten füttere:

  
function currentReservation() {  
 this._Event = '',  
 this._Date = '',  
 this._Type = '',  
 this._Message = {  
  Salutation: '',  
  Name: '',  
  eMail: '',  
  Phone: '',  
  Message: ''  
 }  
}  
var temp_reservationObj = new currentReservation();  

Schließlich möchte ich diesen Datentyp einem Array hinzufügen:

  
var reservationObj = new Array();  
reservationObj.push(temp_reservationObj);  

Der eigene Datentyp wird mehrmals mit neuen Daten befüllt (ohne Seitenreload), die als immer neues Element dem Array hinzugefügt werden sollten. Und "sollte" ist auch das Problem: füge ich ein jeweils neues Element dem Array hinzu (.push(), siehe oben), funktioniert dies auch grundsätzlich, nur werden die Werte aller bereits vorhandenen Elemente des Array mit den Werten des neu hinzugefügten Elements überschrieben.

Auch die Verwendung eines JSON-Objektes a la

  
var temp_reservationObj = {  
       _Event: '',  
       _Date: '',  
       _Type: '',  
       _Message: {  
        Salutation: '',  
        Name: '',  
        eMail: '',  
        Phone: '',  
        Message: ''  
       }  
      }  

bringt keine Änderung. Was mache ich verkehrt?

Vielen Dank vorab für Eure Hilfe!

  1. Hi,

    Ich definiere einen eigenen Datentypen, den ich später mit Formulardaten füttere:
    function currentReservation() {

    Du hast also ein (Funktions-)Objekt definiert,

    var temp_reservationObj = new currentReservation();

    Und legst von diesem eine neue Instanz an.
    temp_reservationObj referenziert jetzt also auf dein neues Objekt vom Typ currentReservation.

    Schließlich möchte ich diesen Datentyp einem Array hinzufügen:

    var reservationObj = new Array();
    reservationObj.push(temp_reservationObj);

    
    >   
    > Der eigene Datentyp wird mehrmals mit neuen Daten befüllt (ohne Seitenreload), die als immer neues Element dem Array hinzugefügt werden sollten. Und "sollte" ist auch das Problem: füge ich ein jeweils neues Element dem Array hinzu (.push(), siehe oben), funktioniert dies auch grundsätzlich, nur werden die Werte aller bereits vorhandenen Elemente des Array mit den Werten des neu hinzugefügten Elements überschrieben.  
      
    Natuerlich, weil du immer noch mit der selben Instanz von currentReservation arbeitest.  
      
    JavaScript uebergibt Objekte \*immer\* per reference.  
    Du hast also gar nicht mehrere Objektinstanzen in deinem Array, sondern lediglich die Referenz auf die eine vorhandene mehrfach eingefuegt.  
    Also aendern sich auch bei "allen" die Daten, wenn du sie bei dem "einen" aenderst.  
      
    Wenn du mehrere Instanzen deines Objektes currentReservation nutzen willst - dann lege auch mehrere Instanzen an.  
      
    MfG ChrisB  
      
    
    -- 
    „This is the author's opinion, not necessarily that of Starbucks.“
    
    1. Hi Chris,

      besten Dank. Ich verstehe. Schade, jedes mal eine neue Instanz des Objektes anzulegen, macht es nicht gerade einfacher. Zumal alles generisch passieren soll. Naja, vielleicht fällt mir ja nochwas ein.

      Besten Dank jedenfalls!

      Hi,

      Ich definiere einen eigenen Datentypen, den ich später mit Formulardaten füttere:
      function currentReservation() {

      Du hast also ein (Funktions-)Objekt definiert,

      var temp_reservationObj = new currentReservation();

      Und legst von diesem eine neue Instanz an.
      temp_reservationObj referenziert jetzt also auf dein neues Objekt vom Typ currentReservation.

      Schließlich möchte ich diesen Datentyp einem Array hinzufügen:

      var reservationObj = new Array();
      reservationObj.push(temp_reservationObj);

      
      > >   
      > > Der eigene Datentyp wird mehrmals mit neuen Daten befüllt (ohne Seitenreload), die als immer neues Element dem Array hinzugefügt werden sollten. Und "sollte" ist auch das Problem: füge ich ein jeweils neues Element dem Array hinzu (.push(), siehe oben), funktioniert dies auch grundsätzlich, nur werden die Werte aller bereits vorhandenen Elemente des Array mit den Werten des neu hinzugefügten Elements überschrieben.  
      >   
      > Natuerlich, weil du immer noch mit der selben Instanz von currentReservation arbeitest.  
      >   
      > JavaScript uebergibt Objekte \*immer\* per reference.  
      > Du hast also gar nicht mehrere Objektinstanzen in deinem Array, sondern lediglich die Referenz auf die eine vorhandene mehrfach eingefuegt.  
      > Also aendern sich auch bei "allen" die Daten, wenn du sie bei dem "einen" aenderst.  
      >   
      > Wenn du mehrere Instanzen deines Objektes currentReservation nutzen willst - dann lege auch mehrere Instanzen an.  
      >   
      > MfG ChrisB  
      >   
      > 
      
      1. besten Dank. Ich verstehe. Schade, jedes mal eine neue Instanz des Objektes anzulegen, macht es nicht gerade einfacher. Zumal alles generisch passieren soll. Naja, vielleicht fällt mir ja nochwas ein.

        Du hattest ja geschrieben "Datentyp". Kann es sein, dass du gar keinen Konstruktor brauchst und ein simples JavaScript-Objektliteral den gleichen Zweck erfüllen würde?

        P.S.: Bitte kein TOFU!

        --
        Reden ist Silber, Schweigen ist Gold, meine Ausführungen sind Platin.
        Self-Code: sh:( ch:? rl:( br:> n4:( ie:{ mo:) va:) de:> zu:} fl:| ss:| ls:~ js:|
        1. Hi.

          Du hattest ja geschrieben "Datentyp". Kann es sein, dass du gar keinen Konstruktor brauchst und ein simples JavaScript-Objektliteral den gleichen Zweck erfüllen würde?

          Offenbar bin ich etwas auf den Kopf gefallen. Was genau meinst Du denn mit "JavaScript-Objektliteral"? Das Ding, was ich bei meinem ersten Posting als Alternative angefügt hatte? Gibts Du mir einen kurzen Denkanstoß?

          Besten dank vorab!

          1. Hi,

            Offenbar bin ich etwas auf den Kopf gefallen. Was genau meinst Du denn mit "JavaScript-Objektliteral"? Das Ding, was ich bei meinem ersten Posting als Alternative angefügt hatte? Gibts Du mir einen kurzen Denkanstoß?

            http://aktuell.de.selfhtml.org/artikel/javascript/organisation/#object-literale

            MfG ChrisB

            --
            „This is the author's opinion, not necessarily that of Starbucks.“
            1. http://aktuell.de.selfhtml.org/artikel/javascript/organisation/#object-literale

              MfG ChrisB

              Vielen Dank für den Tipp. Aber mit einem solchen Objektliteral hatte ich es auch schon probiert (siehe erstes Posting). Leider erfolglos. Auch hier wird offenbar "nur" die Objektreferenz übergeben. Jedenfalls ist das Ergebnis das gleiche.

              Trotzdem vielen Dank.

              1. Vielen Dank für den Tipp. Aber mit einem solchen Objektliteral hatte ich es auch schon probiert (siehe erstes Posting). Leider erfolglos. Auch hier wird offenbar "nur" die Objektreferenz übergeben. Jedenfalls ist das Ergebnis das gleiche.

                Natürlich wird nur die Objektreferenz übergeben. Das ist aber nicht nur in JavaScript üblich, dass Objekte nicht ständig kopiert werden, eine solche Programmiersprache wäre wohl höchst ineffizient.
                Ich verstehe aber auch gar nicht, wo das Problem ist: Warum erzeugst du nicht einfach die neuen Objekte, so wie in diesem Beispiel:

                function createXPile(n){  
                  var result=[];  
                  for (var i=0;i<n;i++){  
                    result.push({x:i});}  
                  return result;}  
                var bla=createXPile(5); // Erzeugt ein Array, dessen 5 Elemente Objekte sind mit der einzigen Eigenschaft x, deren Wert dem Index des Elements entspricht.
                
                --
                Reden ist Silber, Schweigen ist Gold, meine Ausführungen sind Platin.
                Self-Code: sh:( ch:? rl:( br:> n4:( ie:{ mo:) va:) de:> zu:} fl:| ss:| ls:~ js:|
                1. Ich verstehe aber auch gar nicht, wo das Problem ist: Warum erzeugst du nicht einfach die neuen Objekte, so wie ...

                  Hi.

                  Ja, genauso mache ich es jetzt auch. Schreibe halt nicht das Objektliteral als ganzes, sondern alle Eigenschaften ins Array.

                  Besten Dank für Deine Hilfe!

                  Und: habe gerade Deinen Footer gelesen ... spektakulär  ;)

  2. Ich definiere einen eigenen Datentypen, den ich später mit Formulardaten füttere:

    function currentReservation() {

    this._Event = '',
    this._Date = '',
    this._Type = '',
    this._Message = {
      Salutation: '',
      Name: '',
      eMail: '',
      Phone: '',
      Message: ''
    }
    }
    var temp_reservationObj = new currentReservation();

      
    Kleiner Tipp am Rande: Eingebürgert hat sich, Konstruktoren mit einem Großbuchstaben zu beginnen (z.B. `CurrentReservation`{:.language-javascript}), Eigenschaften von Objekten aber mit Kleinbuchstaben (z.B. `{x:50,y:-22,z:0}`{:.language-javascript}).  
    Warum beginnen außerdem einige deiner Objekteigenschaften mit einem Unterstrich?  
      
    
    > Der eigene Datentyp wird mehrmals mit neuen Daten befüllt (ohne Seitenreload), die als immer neues Element dem Array hinzugefügt werden sollten. Und "sollte" ist auch das Problem: füge ich ein jeweils neues Element dem Array hinzu (.push(), siehe oben), funktioniert dies auch grundsätzlich, nur werden die Werte aller bereits vorhandenen Elemente des Array mit den Werten des neu hinzugefügten Elements überschrieben.  
      
    Leider fehlt der relevante Code, da du nicht schreibst, wie dieses Neubefüllen aussieht. Falls du dabei aber keine neuen Instanzen erstellst, sondern einfach das Objekt mit neuen Daten befüllst, ist das der Fehler.  
      
    
    > Auch die Verwendung eines JSON-Objektes a la  
    > ~~~javascript
    
    var temp_reservationObj = {  
    
    >        _Event: '',  
    >        _Date: '',  
    >        _Type: '',  
    >        _Message: {  
    >         Salutation: '',  
    >         Name: '',  
    >         eMail: '',  
    >         Phone: '',  
    >         Message: ''  
    >        }  
    >       }
    
    

    bringt keine Änderung. Was mache ich verkehrt?

    Das ist ein JavaScript-Objektliteral. JSON hat damit nichts zu tun.

    --
    Reden ist Silber, Schweigen ist Gold, meine Ausführungen sind Platin.
    Self-Code: sh:( ch:? rl:( br:> n4:( ie:{ mo:) va:) de:> zu:} fl:| ss:| ls:~ js:|