我经常遇到这种情况,只是想知道我的解决方案是否是最好的,以及是否有更好的解决方案。在许多情况下,我有一个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
还是其他?
答案 0 :(得分:0)
您不能break
中的forEach
。它将在数组的每个元素上运行。您可以使用some
来检查至少一项是否为isInvalid
。一旦找到带有isInvalid = true
的物品,就会短路
if (emailList.some(element => element.isInvalid))
return
答案 1 :(得分:0)
您的forEach对每个元素执行arrow function,而不检查其结果。我不建议使用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();
答案 2 :(得分:0)
您可以使用Array.prototype.every()。
every()方法测试数组中的所有元素是否通过提供的函数实现的测试。它返回一个布尔值。
function validateEmailList(element) {
return element.isInvalid;
}
console.log(emailList.every(validateEmailList));