javascript - 为什么我的 JS 循环会覆盖对象中以前的条目?

标签 javascript node.js object loops

所以我有一个在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 }
}

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

最佳答案

主要问题是,当您调用 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__ 您仍然可以调用他们。

关于javascript - 为什么我的 JS 循环会覆盖对象中以前的条目?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11095018/

相关文章:

javascript - 链接在悬停时跳跃

javascript - Blockly 在 Node.js 上

javascript - d3js 将对象附加到 svg

javascript - 嵌套 ES6 代理未按预期工作

node.js - 使用 Node JS 导出函数

javascript - 在 JAVASCRIPT 中编写一个测验,返回可在 Netflix 上观看的电影

Javascript 在对象数组中找到最接近的数字并检索对象的键值

javascript - xhr 超时在 ie11 中给出无效状态错误

javascript - 无法在 Angular 中显示 Google Charts

javascript - 遍历DOM,将一个带有ID的<ul>的所有 anchor 标签放入一个数组中,