在if语句中循环遍历数组以检查是否所有值都通过

时间:2016-12-02 21:41:24

标签: javascript arrays for-loop checkvalidity

我有一个变量'fieldCount'等于5(我拥有的字段数)。如何在不明确说明每个索引的情况下编写以下内容:

if (
   fields[0].checkValidity() && fields[1].checkValidity() && fields[2].checkValidity()
   && fields[3].checkValidity() && fields[4].checkValidity()
) {
    fieldsPass = true;
}

5 个答案:

答案 0 :(得分:3)

您有一个字段数组,并且您想要迭代它们,并在每个字段上调用有效性检查方法。只有当所有这些都通过时,标记fieldsPass才会是true

这正是Array#every的行为。根据MDN:

  

every()方法测试数组中的所有元素是否都通过了   测试由提供的功能实现。

使用Array.every在每个字段上调用checkValidity()。如果所有字段都有效,则结果为true。如果一个字段失败checkValidity(),则循环将立即返回false,而不检查其他字段。

var fieldPass = fields.every(function(field) {
  return field.checkValidity();
})

答案 1 :(得分:3)

您可以使用循环或一些相当标准的内置浏览器功能。

循环

以下是如何使用循环执行此操作。这应该是最快的代码,但您可能不需要最快的代码,除非您检查大量项目上的大量字段。我建议改为"correct, clear, concise, fast"优先级,所以认为你应该从内置的浏览器功能开始。但这里仅供参考:

var fieldsPass = true;
var i, l = fields.length;
for (i = 0; i < l; i += 1) {
   if (fields[i].checkValidity()) continue;
   fieldsPass = false;
   break;
}

请注意,在循环外声明i变量并在循环外捕获字段长度是可选的。

我做的第一个是因为许多人不知道提升,而且for (var i ...没有创建仅在for循环内可用的变量这一事实,它与声明{ {1}}位于函数顶部,此行为可能导致错误。

第二个我出于习惯,虽然我说你可以把它放在循环检查中。 See this discussion。如果您确实使用循环方法,那么您可能正在寻找更好的性能,因此可能希望使用捕获的长度方式来获得最佳性能。 (如果真的那么重要,你可以使用var i方法。)

浏览器功能Array.Every

您可以使用Array.prototype.every()(来自ECMAScript 2015第6版):

  

Mozilla Developer Network

     

every()方法测试数组中的所有元素是否都通过了由提供的函数实现的测试。

var i = fields.length; while (i--) { }

当传入函数在数组中的每个项目上运行时,它返回fieldsPass = fields.every(function(field) { return field.checkValidity(); }); ,为所有项返回true。如果有人返回true,则会停止并返回false。在某些语言中,如果您熟悉它们,它们会将相同的概念称为 all

或者,最好一次声明false函数,而不是将其放在每个字段上。这可能是不可能的,这取决于你如何实现它(也许它可以访问私有变量?)。请注意,您提供的回调函数的第一个参数(请参阅上面链接中的文档)是迭代的​​checkValidity,即您要检查的字段。如果你的功能看起来像这样,它将起作用:

currentValue

浏览器功能Array.Some

您也可以使用Array.prototype.some()(来自ECMAScript 2015第6版):

  

Mozilla Developer Network

     

some()方法测试数组中的某个元素是否通过了由提供的函数实现的测试。

function checkValidity(field) { /* check validity */ }

fieldsPass = fields.every(checkValidity);

请注意,它基本上只是fieldsPass = !fields.some(function(field) { return !field.checkValidity(); }); 的倒数,因为“ALL VALID”与“NOT(ANY INVALID)”相同。它只是意味着它检查数组中传递函数的任何一个项目,如果是,则返回every。在某些语言中,如果您熟悉它们,它们会将相同的概念称为 any

常规浏览器兼容性说明

请注意,对于这两个功能,浏览器兼容性非常好。如果您不关心版本9以下的IE,那么您就非常安全了。如果这样做,那么您可能希望使用上面链接的MDN页面上提供的polyfill。您可以将该代码包含在javascript文件的全局范围内,然后就可以在IE 8及更低版本中正常使用它。 (我说的是这样开始的代码块:)

true

答案 2 :(得分:2)

就像你说的那样,使用loop.

var fieldsPass = true;
for (var i = 0; i < fields.length; i++) {
  // Exit early if one of them fails
  if (!fields[i].checkValidity()) {
    fieldsPass = false;
    break;
  }
}

答案 3 :(得分:1)

你可以使用.some()方法并反转逻辑来判断是否所有传递都是这样的:

var allPassed = !fields.some(function (field) {
  return !field.checkValidity();
});

答案 4 :(得分:1)

你可以这样做:

fieldsPass = true;
for (i = 0; i < fieldCount; i++)
{
     if(!fields[i].checkValidity())
     {
          fieldsPass = false;
          break;
     }
}