Как обновить элемент объекта через цикл
Я пытаюсь добавить свойство к объекту. У меня есть список с клиентами, и для каждого клиента я хочу добавить массив с письмами, которые отправляются этому клиенту.
Но я не могу добавить его к существующему объекту. Что я делаю не так?
crmuser.find().exec(function(err, crmusers){
console.log(crmusers);
//LOG result
[ { _id: 59563a7181438f4db8193379,
emailName: 'Donald Duck',
shop: 'dd',
moreproperties: '',
email: 'donald@duck.com',
} ]
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);
})
})
1 ответ
Вместо того, чтобы перебирать значения с each
или же forEach
Вы можете использовать map
функция для возврата нового объекта из каждого элемента в вашем массиве пользователей. Поскольку вы - переменная пользователя, это объект, а не массив, лучший асинхронный метод будет mapValues
:
const users = {
john: { email: 'test@test.com' },
anne: { email: 'test@test.com' }
};
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: 'test@test.com' },
// anne: { sendMail: 'result', email: 'test@test.com' }
// };
});