推送对象时,Array.push()使所有元素相同

我是Node和javascript的新手,并且一直在努力追求以下目标。我创建了一个对象,如下所示:

var Subscriber = {

'userID': String,

'email': String,

'name': String,

'stage': String,

'poster': Boolean,

'canEmail': Boolean,

'stage': String, }

我有一个查询mongodb的函数,并遍历结果,尝试加载一系列用户,我将其声明为:

var s = Subscriber;

var subscribers = [];

循环如下所示:

//load array of users that are subscribed to the group

async.forEach(g.subscribers, function(item, callback) {

//load user document for this user

User.findOne({ _id: item}, function(err, u) {

if(!err && u) {

//var s = new Subscriber();

console.log('Sub load, found user %s, building array item', u.email);

console.log('Subs @ loop start');

console.log(util.inspect(subscribers));

console.log('Heres foo: ' + util.inspect(foo));

s.userID = u._id;

s.email = u.email;

s.name = u.firstName + ' ' + u.lastName;

s.stage = u.stage;

s.poster = false; //we're just loading subscribers at this point'

if(s.stage != 'new') s.canEmail = true;

//push new subscriber onto the array

console.log('Pushing ' + util.inspect(s));

subscribers.push(s);

console.log('At end ' + util.inspect(subscribers));

foo.push(s.email);

console.log('Heres foo now: ' + util.inspect(foo));

callback(null, item);

}

在每次调用subscriber.push(s)之后,该数组具有正确数量的元素,但是所有元素都与s的最后一个值匹配,如下所示(从数据库中拉出了两个不同的用户):

[ { userID: 4fc53a71163006ed0f000002,

email: 'test@test.com',

name: 'undefined undefined',

stage: 'new',

poster: false,

canEmail: true },

{ userID: 4fc53a71163006ed0f000002,

email: 'test@test.com',

name: 'undefined undefined',

stage: 'new',

poster: false,

canEmail: true } ]

推送s的单个元素而不是推送整个对象似乎很好。我添加了“ foo”数组作为测试,它可以正常工作:

Heres foo now: [ 'email1@foo.com', 'test@test.com' ]

这里发生了什么?!?!??!

回答:

问题不在于的push方法,Array.prototype而是您的绑定。您要sasync.foreach块的每次迭代中修改相同的对象,而该对象实际上与先前定义的对象相同Subscriber

首先,您应该将s变量的声明移至foreach块。

另外,如果您要创建具有默认值的对象,则该对象应为function,它会返回一个新对象:

function Subscriber() {

return {

'userID': '',

'email': '',

'name': '',

'stage': '',

'poster': false,

'canEmail': false,

'stage': ''

};

};

然后可以实例化这样的Subscriber对象:

var s = Subscriber();

有关更多说明,请参见此答案或MDN闭包。

以上是 推送对象时,Array.push()使所有元素相同 的全部内容, 来源链接: utcz.com/qa/418266.html

回到顶部