2013-09-27 12 views
20

Przekazuję ciąg znaków, który wygląda mniej więcej tak: "John.Doe.100.Newbie-David.Miller.250.Veteran-" do funkcji SplitDatabase, która odpowiednio rozdziela łańcuch i przypisuje wartości do obiektu UserDataEntry. Obiekt UserDataEntry jest następnie przesyłany do globalnej tablicy UserData, która ma przechowywać wszystkie dane użytkownika.Push zastępuje poprzednie dane w tablicy

Z jakiegoś powodu część UserData.push (UserDataEntry) wydaje się nadpisywać poprzednie dane w tablicy UserData. Alert w pierwszej pętli pokazuje poprawne dane w pętli, ale alarm w drugiej pętli na dole pokazuje tylko ostatni rekord w kółko.

Nie jestem pewien, dlaczego tak jest?

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

wyczyść tablicę przed zapisaniem nowych danych! – rach

Odpowiedz

42

Wywołanie push nie skopiuje swój cel, ponieważ JavaScript Object s są przekazywane przez referencję: jesteś pchanie sam Object jak każdego wpisu tablicy.

Można to łatwo rozwiązać poruszając var UserDataEntry = {};wewnątrz ciało pętli, tak, że nowy obiekt jest tworzony każdej pętli iteracji:

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

Blok zdefiniowany przez nawiasy klamrowe nie generuje własnego zakresu; "var UserDataEntry;" może być w tym samym miejscu. Ważnym elementem w pętli jest 'UserDataEntry = {}', który tworzy nowy obiekt, a więc nowe odniesienie. –

7

Połóż linię var UserDataEntry = {} wewnątrz pętli for.

W tej chwili masz tylko jeden obiekt i ustawiasz każdą część tablicy na ten obiekt. Nadpisujesz członków w swojej pętli.

Jeśli utworzysz nowy obiekt wewnątrz pętli, dodasz wszystkich nowych członków do tablicy.

0

var UserDataEntry = {}; - {} jest bardzo ważne.

var UserDataEntry; - Jeśli wstawimy tę pętlę, nadal mamy ten sam problem.

Powiązane problemy