Javascript возвращается в цикле forEach - PullRequest
1 голос
/ 22 мая 2019

Я часто сталкиваюсь с этим сценарием и просто хотел бы знать, является ли мое решение лучшим и может ли быть что-то лучше. Во многих случаях у меня есть цикл forEach, и я хочу проверить, является ли какое-либо из значений неправильным, если они есть, завершить код (return). Вот что бы я делал без цикла:

const email = '...';
if (email.isInvalid) return;

В цикле я бы сделал это:

const emailList ['...', '...', '...'];
const emailErrors = [];

emailList.forEach((element) => {
    // if (element.isInvalid) return; // This won't work here, it just ends this loop instance, which is my problem
    if (element.isInvalid) emailErrors.push(element);
});

if (emailErrors.length > 0) return; // This will end the code correctly

Есть ли лучший подход к этой идее? Используя try, catch или что-то еще?

Ответы [ 3 ]

0 голосов
/ 22 мая 2019

Ваш forEach выполняет функцию стрелки для каждого элемента и не проверяет его результат. Я не рекомендую использовать try-catch, потому что это очень медленно. Попробуйте использовать for-of с return (или break, чтобы не возвращать, а только прерывать цикл и продолжить выполнение кода ниже for)

function start() {
  const emailList = ['abc@test.com', 'invalid 1', 'invalid 2'];
  const emailErrors = [];

  for(let element of emailList)
  {
    console.log(element);
    if(!/@/.test(element)) return;  // some validation (missing @ char)
  };

}

start();
0 голосов
/ 22 мая 2019

Вы можете использовать Array .prototype .every ().

Метод every () проверяет, все ли элементы массива проходят тест, реализованный предоставленной функцией.Возвращает логическое значение.

function validateEmailList(element) {
  return element.isInvalid;
}

console.log(emailList.every(validateEmailList));
0 голосов
/ 22 мая 2019

Вы не можете break от forEach. Он будет работать на каждом элементе массива. Вы можете использовать some, чтобы проверить, является ли хотя бы один из пунктов isInvalid. Это приведет к короткому замыканию, как только элемент с isInvalid = true будет найден

if (emailList.some(element => element.isInvalid))
  return
...