2013-09-27 124 views
20

Tôi đang chuyển một chuỗi trông giống như sau: "John.Doe.100.Newbie-David.Miller.250.Veteran-" vào hàm SplitDatabase tách chuỗi thích hợp và gán các giá trị cho đối tượng UserDataEntry. Đối tượng UserDataEntry sau đó được đẩy vào mảng UserData toàn cục được cho là lưu trữ tất cả dữ liệu người dùng.Đẩy ghi đè dữ liệu trước đó trong mảng

Vì một số lý do, phần UserData.push (UserDataEntry) dường như ghi đè dữ liệu trước đó trong mảng UserData. Cảnh báo trong vòng lặp đầu tiên cho thấy dữ liệu chính xác như vòng lặp, nhưng cảnh báo trong vòng lặp thứ hai ở phía dưới chỉ hiển thị bản ghi cuối cùng hơn và hơn nữa.

Tôi không biết tại sao điều này là?

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

xóa mảng trước khi ghi dữ liệu mới! – rach

Trả lời

42

Calling push sẽ không sao chép đối tượng của bạn, vì JavaScript Object s được thông qua tham khảo: bạn đang đẩy cùng Object như mỗi entry mảng.

Bạn có thể khắc phục điều này một cách dễ dàng bằng cách di chuyển var UserDataEntry = {};bên thân vòng lặp, do đó một đối tượng mới được tạo ra mỗi vòng lặp:

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

Khối được xác định bởi niềng răng của vòng lặp không tạo ra phạm vi riêng của nó; 'var UserDataEntry;' có thể ở cùng một vị trí. Bit quan trọng cần có trong vòng lặp chỉ là 'UserDataEntry = {}', tạo ra một đối tượng mới và một tham chiếu mới. –

7

Đặt dòng của bạn var UserDataEntry = {} bên trong vòng lặp for.

Ngay bây giờ, bạn chỉ có một đối tượng và bạn đang đặt từng phần của mảng thành đối tượng đó. Bạn ghi đè lên các thành viên trong vòng lặp của bạn.

Nếu bạn tạo một đối tượng mới bên trong vòng lặp, bạn sẽ thêm tất cả các thành viên mới vào mảng đó.

0

var UserDataEntry = {}; - {} là rất quan trọng.

var UserDataEntry; - Nếu chúng tôi đặt vòng lặp này vẫn có cùng một vấn đề.