【问题标题】:Push is overwriting previous data in array推送正在覆盖数组中的先前数据
【发布时间】:2013-09-27 15:49:31
【问题描述】:

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

}

【问题讨论】:

  • 在写入新数据之前清除数组!

标签: javascript


【解决方案1】:

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

您可以通过将var UserDataEntry = {}; 移到循环体中轻松解决这个问题,这样每次循环迭代都会创建一个新对象:

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

【讨论】:

  • 循环大括号定义的块不会生成它自己的范围; var UserDataEntry; 可以在同一个地方。循环中的重要部分只是 UserDataEntry = {},它创建了一个新对象和一个新引用。
  • 谁认为这样的事情对程序员来说可能是噩梦?
【解决方案2】:

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

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

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

【讨论】:

    猜你喜欢
    • 2020-03-24
    • 1970-01-01
    • 1970-01-01
    • 2022-11-22
    • 2015-12-16
    • 1970-01-01
    • 2011-03-22
    • 1970-01-01
    • 2017-04-20
    相关资源
    最近更新 更多