очистка ввода электронной почты с использованием реакции и es6

Я пытаюсь просмотреть свое состояние и вытащить содержимое recEmail, cc и bcc. Внутри каждого вы можете иметь несколько электронных писем, разделенных ,. Например

recEmail может иметь: [email protected], [email protected]
копия может иметь: [email protected], [email protected]

Я использую lodash для перебора объекта «this.state» и отправки писем в массив, но тогда мне пришлось бы перебирать этот новый массив, чтобы разделить электронные письма на 1 электронное письмо для каждой позиции массива (так что я могу затем запустите регулярное выражение и посмотрите, является ли это действительным адресом электронной почты или нет).

Этот метод кажется очень грязным, и я не могу не думать, что есть лучший способ сделать это. Вот что у меня есть до сих пор.

  
  this.state = {recEmail: '', cc: '', bcc: '', subject: '', bodyText: '', testInput: false};
  
  stateCleaner(emails){
    var emailstoClean = [];
    _.forOwn(emails, (value, key) => {
      console.log('these are the keys: ', key);
      console.log('these are the values: ', value);
      if(key !== 'testInput'){
        emailstoClean.push(value.split(', '))
      }
    })
    console.log('final emailstoClean: ', emailstoClean);
    return emailstoClean
  }

Это дает мне два электронных письма в нулевом индексе массива emailstoClean и два электронных письма в позиции 1 (я ввел два в recEmail и два в поле cc).

Есть ли способ упростить это, чтобы просто получить одно электронное письмо в каждом индексе массива? Также, возможно, это немного связано, но включение регулярного выражения для проверки того, является ли это действительным адресом электронной почты, тоже было бы здорово. Если есть какие-либо другие детали, которые вам нужны, просто дайте мне знать. Я ценю помощь каждого.


person Milos    schedule 19.08.2017    source источник


Ответы (1)


Несколько вещей: электронные письма удивительно сложны — быстрый поиск в Google подтвердит, что регулярное выражение — не лучший способ их проверки.

Для ваших электронных писем в массив вам не нужен lodash. Tke ваши строки электронной почты непосредственно из ваших свойств состояния и вызовите split(',') для каждого из них. Это даст вам массив писем. Сделайте это для всех элементов электронной почты в вашем объекте состояния, а затем вызовите concat для массивов или используйте новый оператор распространения, чтобы поместить их все в один массив с уникальными индексами.

Затем вы можете использовать карту, фильтр или что-то еще для обработки каждого адреса электронной почты в массиве.

person hairmot    schedule 19.08.2017
comment
Спасибо за ответ. Я надеялся на что-то более элегантное, чем сплит, но я определенно готов это сделать. - person Milos; 20.08.2017
comment
Более элегантным решением было бы хранить электронные письма в массиве в вашем состоянии. React справится с этим хорошо, и ваше состояние будет лучшим представлением вещей в целом. Ознакомьтесь с пользовательским интерфейсом Outlook.com, чтобы получить представление о том, как вы можете вводить и отображать несколько электронных писем как коллекцию, а не как строку. - person hairmot; 20.08.2017