为什么我的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]; }