我有用于检查以下场景的验证函数,但函数使用了映射和过滤器方法。所以 它在 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);
}
最佳答案
一种可能的方法是在循环中调用 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/