Sono nuovo al nodo e javascript e ho sbattuto la testa su quanto segue. Ho creato un oggetto come segue:Array.push() rende tutti gli elementi uguali quando si preme un oggetto
var Subscriber = {
'userID': String,
'email': String,
'name': String,
'stage': String,
'poster': Boolean,
'canEmail': Boolean,
'stage': String, }
Ho una funzione in cui mi interrogo MongoDB, ed il ciclo attraverso i risultati, il tentativo di caricare una serie di abbonati, che ho dichiarato come:
var s = Subscriber;
var subscribers = [];
il ciclo aspetto:
//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);
}
Dopo ciascuna chiamata alla subscribers.push (s), la matrice ha un corretto numero di elementi, ma tutti gli elementi corrispondenti gli ultimi valori di s, così (condue utenti diversi essere tirato dal DB):
[ { userID: 4fc53a71163006ed0f000002,
email: '[email protected]',
name: 'undefined undefined',
stage: 'new',
poster: false,
canEmail: true },
{ userID: 4fc53a71163006ed0f000002,
email: '[email protected]',
name: 'undefined undefined',
stage: 'new',
poster: false,
canEmail: true } ]
spingendo un singolo elemento di s anziché l'intero oggetto sembra essere fine. Ho aggiunto la matrice "foo" come un test, e funziona bene:
Heres foo now: [ '[email protected]', '[email protected]' ]
Che cosa sta succedendo qui ???!?!
Cosa significa 'g.subscribers' assomigliare? – alessioalex
Oggetti e matrici (che sono oggetti) vengono passati per riferimento in JavaScript. Se 's' è un oggetto, e lo stai riutilizzando cambiando solo le proprietà e quindi spingendo lo stesso oggetto sull'array in un ciclo, gli oggetti nell'array sono tutti riferimenti allo stesso oggetto. – Steve
Grazie! Questo è stato molto utile. Stavo pensando che potrebbe essere qualcosa con riferimenti, ma non riuscivo a capirlo. Immagino che questo sia quello che succede quando sei ultimo lavoro di sviluppo è stato due decenni fa in linguaggi all'avanguardia come Pascal e C! – pat