当前位置: 首页 > 面试题库 >

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

慕容晔
2023-03-14
问题内容

我是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闭包。



 类似资料:
  • 使用selenium web驱动程序来自动化测试,在我们的应用程序元素(3个输入字段)中xpath是相同的,所以我不能传递这三个字段中的值,请查找html

  • 问题内容: 如果我有: 里面有双精度值,我应该怎么做才能将所有ArrayList元素加起来? 如? 问题答案: 两种方式: 使用索引: 使用“针对每个”样式:

  • 有没有一种简单的方法可以“$推送”文档的所有字段?例如: 假设我有一本Mongo藏书: 我想按作者对它们进行分组-对于每个作者,列出他的整本书对象: 我可以通过显式推送所有字段来实现这一点: 但是有没有什么捷径,比如:

  • 我正在学习用java实现链表类。但每次调用get方法时,都会得到最后一个节点的内容。我不知道为什么。代码如下:, 我得到的结果是, 我想在类中添加一些数据,并创建该类的链接列表。 提前谢谢!

  • 我想给数组的每个元素添加相同的值。我的方法是使用default添加值。它与这个有一点不同,因为:我不知道如何写入数组的现有元素,而不是新元素。 输入: 提前感谢!

  • 我在使用for循环将元素分配到List时遇到了麻烦。以下是我遇到麻烦的代码部分: 出于某种原因,该方法返回一个所有元素完全相同的列表。我试着输出列表元素,看看这是在哪里发生的,它似乎是在循环之外发生的。例如: 显示不同元素的列表,而这: 显示仅由相同元素组成的列表。在我看来,这些元素被正确地添加到for循环内部的列表中,但最终却变得完全相同。这是为什么?我该怎么解决?