【问题标题】:Why is my JS Loop overwriting previous entries in my object?为什么我的 JS 循环会覆盖对象中以前的条目?
【发布时间】:2012-06-21 03:23:20
【问题描述】:

所以我有一个对象,我在 nodejs 中使用它。它看起来像这样:

for(var i = 0; i < x.length; i++) {
            var sUser = x[i];
            mUsers[sUser.userid] = CreateUser(sUser);
            ++mUsers.length;
        }

所以我从外部来源提取信息,然后它分解为一个充满以下实例的数组:

[{ name: 'Michael Lovesllamas Lankford',
 created: 1338420951.11,
 laptop: 'pc',
 laptop_version: null,
 userid: '4fc6aed7eb35c14ad6000057',
 acl: 0,
 fans: 1,
 points: 5,
 avatarid: 34 }]

等等。

这样信息就会在上述函数中作为 x 传递。

global.mUsers = {length:0}

global.UserBase = {
    userid: -1,
    name: "noidea",
    isSuperUser: false,
    isDJ: false,
    laptop: "pc" };

process.on("registered", OnRegistered);

global.OnRegistered = function(a) {
        //misc code here
        RegisterUsers(a.users);
        //misc code here
}

global.CreateUser = function(a) {
    var b = UserBase;
    b.userid = a.userid;
    b.name = a.name;
    b.laptop = a.laptop;
    if (a.acl > 0) b.isSuperUser = true;
    return b;
};

global.RegisterUsers = function(x) {
        for(var i = 0; i < x.length; i++) {
            var sUser = x[i];
            mUsers[sUser.userid] = sUser;
            ++mUsers.length;
        }

}

现在,我已将其记录在循环中,并且 mUsers[sUser.userid] 确实 = sUser。 但是当我在循环之后立即 console.log(mUsers) 时,我得到了这个:

{ 
 userid1: { userid: userid3, name: name3, item: item3 },
 userid2: { userid: userid3, name: name3, item: item3 },
 userid3: { userid: userid3, name: name3, item: item3 }
}

而且我不知道它为什么会被覆盖。有什么想法吗?

【问题讨论】:

  • 您真的是指++i 而不是i++,它们在for 循环中应用时完全不同。
  • 你真正想做什么? CreateUser 是做什么的?
  • 我的意思是 i++,我的意思是删除 CreateUser,让我编辑一下。
  • @DaltonGore 好的,接下来你能验证x 是你所期望的吗?
  • 我刚刚编辑了它,这是无法正常工作的完整功能。第一点是 x 发生了什么的实际日志,但还有更多 [它不同] 问题似乎出在 CreateUser 上,就像我刚刚做 mUsers[sUser.userid] = sUser;结果很好。 >:如果我混淆了我很抱歉T_T

标签: javascript node.js object loops


【解决方案1】:

主要问题是,当您调用 CreateUser 时,您会不断引用同一个对象,因此它只是简单地更新并返回一个在所有调用中都保留的引用,这就是为什么当您打印它时,它刚刚打印了最后一次更新。 您需要创建对象的副本。

global.CreateUser = function(a) {
    var b = Object.create(UserBase); // this will create a copy of it.
    b.userid = a.userid;
    b.name = a.name;
    b.laptop = a.laptop;
    if (a.acl > 0) b.isSuperUser = true;
    return b;
};

现在 CreateUser 实际上正在创建一个副本,当您浏览属性时,默认的可能不会立即出现,但仍然存在,它们只是被移动到 __proto__ 您仍然可以调用它们。

【讨论】:

    【解决方案2】:

    试试下面它对我有用

    var obj = {
                userid1: { userid: "userid1", name: "name3", item: "item3" },
                userid2: { userid: "userid2", name: "name3", item: "item3" },
                userid3: { userid: "userid3", name: "name3", item: "item3" }
            };
    
    var muser = {};
    
    for (var key in obj) {
        muser[key] = obj[key];
    }
    

    【讨论】:

    • 对不起,我可能误导了大家。我将用一个更好的例子来编辑它。但原来的不是对象,是数组
    • 我将对象修改为数组,它对我有用,请参见下面的伪代码 var obj = [ { userid: "userid1", name: "name1", item: "item1" }, { userid : "userid2", name: "name2", item: "item2" }, { userid: "userid3", name: "name3", item: "item3" } ]; var muser = {length:0} for (var i = 0; i
    猜你喜欢
    • 2019-11-24
    • 2015-01-20
    • 2017-04-06
    • 1970-01-01
    • 2021-11-20
    • 1970-01-01
    • 2020-12-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多