所以我有一个对象,我在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 }
}
而且我不知道为什么会被覆盖。有什么想法吗?
答案 0 :(得分: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__
您仍然可以调用它们。 / p>
答案 1 :(得分:0)
尝试以下它对我有用
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];
}