2017-07-13 4 views
0

Ich versuche, eine Eigenschaft zu einem Objekt hinzuzufügen. Ich habe eine Liste mit Kunden, und für jeden Kunden möchte ich ein Array mit Mails hinzufügen, die an diesen Kunden gesendet werden.So aktualisieren Sie ein Objekt Element über Schleife

Aber ich kann es dem vorhandenen Objekt nicht hinzufügen. Was mache ich falsch?

crmuser.find().exec(function(err, crmusers){ 
    console.log(crmusers); 

    //LOG result 
    [ { _id: 59563a7181438f4db8193379, 
     emailName: 'Donald Duck', 
     shop: 'dd', 
     moreproperties: '', 
     email: '[email protected]', 
    } ] 

    async.each(Object.keys(crmusers), function(key, callback){ 
     mailService.getLogs({to: crmusers[key].email, typeMail: "CRM"}, function(err, result){ 
     console.log("res", result); // here we have the result from the mailService.getLogs() function 


     crmusers[key]["sendMail"] = {result}; //Here I try to add a new property to the object 

     console.log("USERR", crmusers[key]); // And here I can see that the property is not added 
     callback(); 
     }) 
    }, function(){ 
     status = 200; 
     response = {message: 'OK', crmusers}; 
     return res.status(status).json(response); 
    }) 
}) 
+0

können Sie sich 'err' und auf eventuelle Fehler? – Sridhar

+0

Ihr Code funktioniert gut für mich. Möglicherweise mehrere Elemente mit derselben ID im Array? – Sridhar

Antwort

0

Statt mit einem each durch Werte iterieren oder forEach können Sie eine map Funktion verwenden, um ein neues Objekt von jedem Element in Ihrem Benutzer-Array zurück. Wie Sie Benutzer variabel sind ein Objekt ist kein Array die beste Methode Asynchron mapValues wäre zu verwenden:

const users = { 
john: { email: '[email protected]' }, 
anne: { email: '[email protected]' } 
}; 

async.mapValues(users, function (user, key, callback) { 
    mailService.getLogs({to: user.email, typeMail: "CRM"}, function(err, result){ 
    if (err) callback(err); 
    user["sendMail"] = result; 
    callback(null, user); 
    }) 
}, function(err, result) { 
    // result is now a new map of your users 
    // { 
    // john: { sendMail: 'result', email: '[email protected]' }, 
    // anne: { sendMail: 'result', email: '[email protected]' } 
    // }; 
}); 
+0

Danke! Aber ich bekomme ein 'TypeError: Kann Eigenschaft nicht lesen 'Symbol (Symbol.toStringTag)' von undefiniertem' Fehler auf 'async.mapValues ​​(crmusers), Funktion (Benutzer, Schlüssel, Rückruf) {' crmusers ist ein Objekt, das wir von mongoose anfordern . Wie 'crmusers.find(). Exec (function (err, crmusers)' – NVO

+0

Bearbeitete meine Frage mit der Find-Zeile und das Ergebnis von crmusers – NVO

+0

Fügen Sie eine Konsole des cmsusers-Objekts hinzu. – sidhuko

Verwandte Themen