Push正在覆盖数组中的先前数据

时间:2013-09-27 15:49:32

标签: javascript

我将一个类似于“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);
    }

}

3 个答案:

答案 0 :(得分:59)

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

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

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

答案 1 :(得分:8)

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

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

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

答案 2 :(得分:0)

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

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