Как отправить пары ключ-значение объекта, которые содержат только значения?

#javascript #key-value #mailgun #nodemailer

#javascript #ключ-значение #mailgun #nodemailer

Вопрос:

Я создаю онлайн-заявку на работу, которая при отправке отправляет электронное письмо через nodemailer и mailgun менеджеру по найму. Приложение довольно длинное, и не все поля обязательны. В настоящее время я настроил отправку всех пар ключ-значение в электронном письме менеджеру по найму, но если поле оставлено пустым, я бы предпочел просто исключить эту пару ключ-значение из электронного письма. Как я мог бы это сделать?

вот мой код nodemailer :

 const nodemailer = require('nodemailer');
const mailgun = require('nodemailer-mailgun-transport');
const debug = require('debug')('app:mail');

const auth = {
    auth: {
       api_key: '**************************************',
       domain: '*************************.mailgun.org' 
    }
};

const transporter = nodemailer.createTransport(mailgun(auth));

function sendAppliedEmail(applicant) {
  let html = '<div style="background: url(****************************************) center center/cover no-repeat; background-size: auto;">'
  html  = '<img src="**************************" alt="logo" style="margin: 0 auto;">';
  html  = '<h2 style="color: #f49842; text-align: center">New Applicant</h2>'
  html  = '<ul>';

  Object.entries(applicant).forEach(([key, value]) => {

    html  = `<li>${key.replace(/([a-z])([A-Z])/g, `$1 $2`).toUpperCase().fontcolor('green')}: ${value}</li>`;
  });

  html  = '</ul></div>';

  const mailOptions = {
    from: 'info@example.com',
    to: 'sample@example.com, sampleme@example.com, sampletwo@example.com',
    subject: 'New Applicant to Tropical Sno',
    html
  };

  transporter.sendMail(mailOptions, (err, info) => {
    if (err) {
      debug(`Error: ${err}`);
    } else {
      debug(`Info: ${info}`);
    }
  });
}

module.exports = sendAppliedEmail;
  

Комментарии:

1. if (value.length) { ... }

2. Самый простой способ выполнить цикл с ключом объектов — это выполнить for(let key in obj){...}

Ответ №1:

Вы можете использовать Array.Prototype.Filter , чтобы получить все пары, значение которых не является пустым или неопределенным, а затем создать html для этого отфильтрованного массива.

 Object.entries(applicant).filter(([key,value])=>value).forEach(([key, value]) => {

    html  = `<li>${key.replace(/([a-z])([A-Z])/g, `$1 $2`).toUpperCase().fontcolor('green')}: ${value}</li>`;
  });
  

Ответ №2:

Вы можете использовать условие ( if )

 Object.entries(applicant).forEach(([key, value]) => {
  if(value) {    
    html  = `<li>${key.replace(/([a-z])([A-Z])/g, `$1 $2`).toUpperCase().fontcolor('green')}: ${value}</li>`;
  }
});
  

Комментарии:

1. Вау! Намного проще, чем я думал. Теперь это сработало, однако ключ все еще отображается, даже если значение пустое. Могу ли я использовать if (key amp; amp; value) {……?