javascript - 不使用 map 、过滤器的自定义 Javascript 验证

标签 javascript arrays validation ecmascript-5

我有用于检查以下场景的验证函数,但函数使用了映射和过滤器方法。所以 它在 IE8 中不工作。如何在不使用 map 和 filter 的情况下重写这个函数。

var case1 = "stack(2),flow(2),over(4),temp(7)"; - true
var case2 = "stack(2),flow(3),over(4),temp(k)"; - false
var case3 = "stack(2),flow(2),over(4),temp(0"; - false
var case4 = "stack(2),flow(2),over(,temp)"; - false
var case5 = "stack(2),flow(2),over(4)temp(8)"; - false
var case6 = "stack(1),flow(7),over,temp"; - true
var case7 = "stack(1),flow(7),OVER,Temp"; - true
var case8 = "stack(1),flow(7),over_r,temp_t"; - true

Javascript 函数:

function validateChunk(s)
{
    return !!s.match(/^[a-z]+(?:\(\d+\))?$/);
}

function filterValid(v)
{
    return !v;
}

function testCases(str)
{
    var chunks = str.split(",");
    var validated = chunks.map(validateChunk);
    return (0 === validated.filter(filterValid).length);

}

jsfiddle

最佳答案

一种可能的方法是在循环中调用 validateChunk 函数:

for (var i = 0, l = chunks.length; i < l; i++) {
  if (! validateChunk(chunks[i])) {
    return false;
  }
}
return true;

作为旁注,当 .test 显然足够时使用 .match 完全没有意义(因为您不必收集匹配结果)。所以我会像这样重写函数:

function validateChunk(str) {
  return /^[a-z]+(?:\(\d+\))?$/.test(str);
}

最后,不禁注意到所有这些验证都可以用一个正则表达式完成:

function testCases(str)
{
    var pattern = /^[a-z]+(?:\(\d+\))?(?:,[a-z]+(?:\(\d+\))?)*$/
    return pattern.test(str);
}

实际上,从您的描述来看,模式应该略有不同:首先,_ 符号是有效的,应该包含在字符类中;其次,同一个类也应该包括 A-Z 范围,或者应该给模式 /i 修饰符。 This demo包括所有这些变化。

关于javascript - 不使用 map 、过滤器的自定义 Javascript 验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20669037/

相关文章:

javascript - 初学者挑战 : Sum all even numbers 1-1000. 是我的基本原理错误还是我的代码错误?

javascript - jQuery 获取段落内的数字,但不获取类中的数字

c - 同时修改数组的所有元素

c++ - "glibc detected - double free or corruption"在复杂数组的 memcpy 期间

javascript - kflorence jquery 向导 : branch validation

django ModelForm 似乎没有验证 BooleanField

javascript - 代码总是返回 NAN

javascript - 在同一页面上显示多个 Google 图表

c - 最小值和最大值不是数组中的数字

c# - 对多个 WPF 控件应用类似的绑定(bind)