为什么我的JS循环覆盖在我的对象以前的条目?

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

}

现在,我已经在循环中logging了它,并且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的时候,你不断地引用同一个对象,因为它只是更新并返回一个被所有调用保留的引用,这就是为什么当你打印它的时候,最后更新。 您需要创build对象的副本。

 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实际上是创build一个副本,当你通过属性默认的可能不会立即出现,但仍然存在,他们已经被简单地移动到__proto__你仍然可以调用它们。

尝试下面它为我工作

 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]; }