我正在构建一个函数,它在运行代码块之前验证用户输入在应用程序的上下文中是否有意义。我想知道一个" if ... else"像这样的语句或switch语句将更可靠地工作/否则是一个更好的解决方案?我倾向于if ... else因为我只有两个结果 - 用户输入有效或者告诉用户程序会接受什么,但是我希望在我参与之前有更多经验的人提供建议
编辑:为了清楚起见,我只希望我的代码在i和o都是" a"或者" b"或者两者都是" c"或者" d"或者两者都是" e"或" f"。
console.log("i="+i+" o="+o);
if
(((i == ("a" || "b")) && (o == ("a" || "b")))
|| ((i == ("c" || "d")) && (o == ("c" || "d")))
|| ((i == ("e" || "f")) && (o == ("e" || "f"))))
{
//my block here
}
else
{
//tell the user their input doesn't make sense
}
另外,在这种情况下我是否正确处理了我的布尔运算符?
答案 0 :(得分:4)
首先,您的if
语句错误,因为JavaScript布尔表达式被强制转换为布尔值。
意义:
'a' || 'b'
将始终返回'a'
,因为'a'
求值为true
且JS引擎无需检查||
语句的第二个操作数。
所以你的if
陈述应该是这样的:
if(((i == "a" || i == "b") && (o == "a" || o == "b")) ||
((i == "c" || i == "d") && (o == "c" || o == "d")) ||
((i == "e" || i == "f") && (o == "e" || o == "f"))
答案 1 :(得分:4)
您可以尝试使用如下所示的简单解决方案,而不是使用那些可能使其无法读取的...或块。
在这个解决方案中,我们首先创建一个允许值的映射,并且对于每个值,第二个变量允许的组合是什么,然后我们检查映射中是否存在a
的值,如果是,那么我们检查i
的值是否为允许组合中的允许值
function test(a, i) {
var map = {
a: ['a', 'b'],
b: ['a', 'b'],
c: ['c', 'd'],
d: ['c', 'd'],
e: ['e', 'f'],
f: ['e', 'f']
};
if (map[a] && map[a].indexOf(i) > -1) {
console.log('found', a, i, result === true)
} else {
console.log('not found', a, i, result === false)
}
}

答案 2 :(得分:3)
首先,您的Javascript无法正常工作,因为非空字符串的计算结果为("c" || "d")
,因此i
只评估为" c"。意味着您当前正在检查的是o
和i
是相同的值。
实际上,这实际上涵盖了您需要的一半案例(如果o
和"a"
相等,您肯定会继续,无论它们是"b"
,{{1}等等)。
你想要的逻辑是:
if( ((i == "a" || i == "b") && (o == "a" || o == "b")) ||
((i == "c" || i == "d") && (o == "c" || o == "d")) ||
((i == "e" || i == "f") && (o == "e" || o == "f"))
){
// valid
} else {
// invalid
}
我更喜欢那种if
陈述给你可能最终会遇到的错综复杂的switch
。
你也可以这样接近它。你意识到i
和o
之间只能有一个字母,所以你可以写出这样的逻辑:
if( Math.abs(i.charCodeAt(0) - o.charCodeAt(0)) <= 1 ){
// valid
} else {
// invalid
}
这就是说,只要i
和o
是相同的字母或不超过一个(使用其ASCII值进行比较),它就是有效的。 Here是一个演示。
check("a", "a")
// true
check("a", "b")
// true
check("a", "c")
// false
check("e", "f")
// true
check("a", "a")
// true
check("b", "a")
// true
答案 3 :(得分:1)
你也可以这样做:
var i='a', o='b',
allowed = [['a','b'], ['c', 'd'], ['e', 'f']];
function test(one, two) {
return allowed.some(function(elem) {
return (elem.indexOf(one)>=0 && elem.indexOf(two)>=0);
});
}
console.log(test(i, o));
拥有所有允许值对的数组,然后使用Array.prototype.some()来测试i
和o
是否在允许的值范围内。 .some()
将为数组中的每个元素执行一次回调函数,直到找到一个回调返回true值的元素。如果找到这样的元素,它会立即返回true。
以下是一个代码段 :
// Only for this snippet
console.log = function(txt) {
var result = document.getElementById("result");
result.innerText += txt + ", ";
}
// allowed values
var i, o, allowed = [['a','b'], ['c', 'd'], ['e', 'f']];
// function to test
function test(one, two) {
return allowed.some(function(elem) {
return (elem.indexOf(one)>=0 && elem.indexOf(two)>=0);
});
}
// all tests
i = 'a'; o = 'b';
console.log(test(i, o));
i = 'c'; o = 'd';
console.log(test(i, o));
i = 'e'; o = 'f';
console.log(test(i, o));
i = 'a'; o = 'c';
console.log(test(i, o));
i = 'd'; o = 'e';
console.log(test(i, o));
i = 'x'; o = 'y';
console.log(test(i, o));
&#13;
<p id="result"></p>
&#13;