2013-09-27 12 views
20

Sto passando una stringa che assomiglia a qualcosa: "John.Doe.100.Newbie-David.Miller.250.Veteran-" alla funzione SplitDatabase che suddivide la stringa in modo appropriato e assegna i valori dell'oggetto UserDataEntry. L'oggetto UserDataEntry viene quindi inserito nell'array UserData globale che dovrebbe memorizzare tutti i dati dell'utente.Push sovrascrive i dati precedenti nell'array

Per qualche motivo, la parte UserData.push (UserDataEntry) sembra sovrascrivere i dati precedenti nell'array UserData. L'avviso nel primo ciclo mostra i dati corretti mentre scorre, ma l'avviso nel secondo ciclo in basso mostra solo l'ultimo record più e più volte.

Non sono sicuro del motivo?

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

chiaro array prima di scrivere nuovi dati! – rach

risposta

42

Calling push non copierà l'oggetto, perché JavaScript Object s sono passati per riferimento: si sta spingendo lo stesso Object come ogni voce di array.

È possibile risolvere questo problema facilmente spostando il var UserDataEntry = {};all'interno del corpo del ciclo, in modo che un nuovo oggetto viene creato ogni iterazione del ciclo:

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

Il blocco definito dalle parentesi del ciclo non genera il proprio ambito; il 'var UserDataEntry;' può essere nello stesso posto. Il bit importante da avere nel ciclo è proprio 'UserDataEntry = {}', che crea un nuovo oggetto e quindi un nuovo riferimento. –

7

Metti la tua linea di var UserDataEntry = {} all'interno del ciclo for.

Al momento, si dispone di un solo oggetto e si imposta ogni parte dell'array su quell'oggetto. Sovrascrivi i membri nel tuo ciclo.

Se si crea un nuovo oggetto all'interno del ciclo, si aggiungeranno tutti i nuovi membri all'array.

0

var UserDataEntry = {}; - {} è molto importante.

var UserDataEntry; - Se mettiamo questo ciclo in loop, abbiamo ancora lo stesso problema.

Problemi correlati