2013-09-27 13 views
20

Ich übergebe eine Zeichenfolge, die etwa wie folgt aussieht: "John.Doe.100.Newbie-David.Miller.250.Veteran-" zu der SplitDatabase-Funktion, die die Zeichenfolge entsprechend aufteilt und ordnet die Werte für das UserDataEntry-Objekt. Das UserDataEntry-Objekt wird dann in das globale UserData-Array eingefügt, das alle Benutzerdaten speichern soll.Push überschreibt vorherige Daten im Array

Aus irgendeinem Grund überschreibt der UserData.push (UserDataEntry) Teil frühere Daten im Array UserData. Der Alarm in der ersten Schleife zeigt die korrekten Daten an, wenn er eine Schleife ausführt, aber die Warnung in der zweiten Schleife unten zeigt nur den letzten Datensatz immer wieder an.

Ich bin mir nicht sicher, warum das ist?

var UserData = []; 


function SplitDatabase(result) { 
    var RawUsers = result.split('-'); 
    var UserDataEntry = {}; 


    for (var i = 0; i < (RawUsers.length - 1); i++) { 
     var tempUserData = RawUsers[i].split('.'); 
     for (var x = 0; x < (tempUserData.length); x++) { 

      switch (x) { 
      case 0: 
       UserDataEntry.firstname = tempUserData[x]; 
       break; 
      case 1: 
       UserDataEntry.lastname = tempUserData[x]; 
       break; 
      case 2: 
       UserDataEntry.points = tempUserData[x]; 
       break; 
      case 3: 
       UserDataEntry.rank = tempUserData[x]; 
       UserData.push(UserDataEntry); 
       alert(UserData[i].firstname); 
       break; 
      } 
     } 

    } 

    for (var i = 0; i < (UserData.length); i++) { 
     alert(UserData[i].firstname); 
    } 

} 
+1

löschen Sie das Array, bevor Sie neue Daten schreiben! – rach

Antwort

42

Aufruf push wird das Objekt nicht kopieren, weil JavaScript Object s Referenz übergeben werden: Sie haben die gleiche Object wie jedes Array-Eintrag sind drängen.

Sie können dies leicht beheben, indem die var UserDataEntry = {};innerhalb den Schleifenkörper bewegt, so dass ein neues Objekt jeder Iterationsschleife erstellt:

for (var x = 0; x < (tempUserData.length); x++) { 
     var UserDataEntry = {}; 
+2

Der durch die geschweiften Klammern der Schleife definierte Block generiert keinen eigenen Bereich; Der 'var UserDataEntry;' kann sich an derselben Stelle befinden. Das wichtige Bit in der Schleife ist nur der 'UserDataEntry = {}', der ein neues Objekt und damit eine neue Referenz erzeugt. –

7

für Schleife in der Legen Sie Ihre Linie var UserDataEntry = {}.

Im Moment haben Sie nur ein Objekt, und Sie setzen jeden Teil des Arrays auf dieses Objekt. Sie überschreiben die Mitglieder in Ihrer Schleife.

Wenn Sie innerhalb der Schleife ein neues Objekt erstellen, fügen Sie dem Array alle neuen Elemente hinzu.

0

var UserDataEntry = {}; - {} ist sehr wichtig.

var UserDataEntry; - Wenn wir diese Schleife in Schleife immer noch ein gleiches Problem haben.

Verwandte Themen