Как обновить элемент объекта через цикл

Я пытаюсь добавить свойство к объекту. У меня есть список с клиентами, и для каждого клиента я хочу добавить массив с письмами, которые отправляются этому клиенту.

Но я не могу добавить его к существующему объекту. Что я делаю не так?

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' }
    // };
});
Другие вопросы по тегам