我正在将一个类似于“ John.Doe.100.Newbie- David.Miller.250.Veteran-”的字符串传递给SplitDatabase函数,该函数将适当地拆分字符串并将值分配给UserDataEntry对象。然后,将UserDataEntry对象推入应该存储所有用户数据的全局UserData数组中。
但是由于某种原因,UserData.push(UserDataEntry)部分似乎正在覆盖UserData数组中的先前数据。第一个循环中的警报在循环时显示正确的数据,但底部的第二个循环中的警报一次又一次地显示最后一条记录。
我不确定为什么会这样吗?
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); } }
调用push不会复制您的对象,因为JavaScript Object是通过引用传递的:您要对Object每个数组条目进行相同的操作。
push
Object
您可以通过在循环主体var UserDataEntry = {}; 内部 移动轻松地解决此问题,以便在每次循环迭代时创建一个新对象:
var UserDataEntry = {};
for (var x = 0; x < (tempUserData.length); x++) { var UserDataEntry = {};