JavaScript在forEach循环中返回

时间:2019-05-22 05:35:48

标签: javascript foreach try-catch

我经常遇到这种情况,只是想知道我的解决方案是否是最好的,以及是否有更好的解决方案。在许多情况下,我有一个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 :(得分:0)

您不能break中的forEach。它将在数组的每个元素上运行。您可以使用some来检查至少一项是否为isInvalid。一旦找到带有isInvalid = true的物品,就会短路

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

答案 1 :(得分:0)

您的forEach对每个元素执行arrow function,而不检查其结果。我不建议使用try-catch,因为它非常慢。尝试将for-ofreturn一起使用(或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();

答案 2 :(得分:0)

您可以使用Array.prototype.every()。

every()方法测试数组中的所有元素是否通过提供的函数实现的测试。它返回一个布尔值。

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

console.log(emailList.every(validateEmailList));