Javascript 推送正在覆盖阵列中的上一个数据

Javascript 推送正在覆盖阵列中的上一个数据,javascript,Javascript,我正在向SplitDatabase函数传递一个类似于“John.Doe.100.Newbie David.Miller.250.退伍军人”的字符串,该函数将适当地拆分字符串并将值分配给UserDataEntry对象。然后将UserDataEntry对象推入全局UserData数组,该数组应该存储所有用户数据 但是,由于某种原因,UserData.push(UserDataEntry)部分似乎覆盖了UserData数组中以前的数据。第一个循环中的警报在循环时显示正确的数据,但底部第二个循环中的警报

我正在向SplitDatabase函数传递一个类似于“John.Doe.100.Newbie David.Miller.250.退伍军人”的字符串,该函数将适当地拆分字符串并将值分配给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);
    }

}
var UserData=[];
函数拆分数据库(结果){
var RawUsers=result.split('-');
var UserDataEntry={};
对于(var i=0;i<(RawUsers.length-1);i++){
var tempUserData=RawUsers[i]。拆分('.');
对于(var x=0;x<(tempUserData.length);x++){
开关(x){
案例0:
UserDataEntry.firstname=tempUserData[x];
打破
案例1:
UserDataEntry.lastname=tempUserData[x];
打破
案例2:
UserDataEntry.points=tempUserData[x];
打破
案例3:
UserDataEntry.rank=tempUserData[x];
push(UserDataEntry);
警报(UserData[i].firstname);
打破
}
}
}
对于(var i=0;i<(UserData.length);i++{
警报(UserData[i].firstname);
}
}

调用
push
不会复制您的对象,因为JavaScript
对象
是通过引用传递的:您正在推送与每个数组项相同的
对象

您可以通过移动
var UserDataEntry={}来轻松解决这个问题,以便在每次循环迭代中创建一个新对象:

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

将您的行
var UserDataEntry={}
放入for循环中

现在,您只有一个对象,并且将数组的每个部分都设置为该对象。覆盖循环中的成员


如果在循环中创建一个新对象,则会将所有新成员添加到数组中。

var UserDataEntry={};
-{}非常重要


var-UserDataEntry;
——如果我们把它放在循环中,仍然会有同样的问题。

在写入新数据之前清除数组!由循环大括号定义的块不会生成它自己的作用域;
var-UserDataEntry;
可以在同一个位置。循环中重要的一点就是
UserDataEntry={}
,它创建了一个新对象和一个新引用。上面的答案已经提到了本文给出的解决方案。