javascript或(| |)未返回预期结果
我有一个字段需要以多种格式接受城市/州的输入值,包括javascript或(| |)未返回预期结果,javascript,conditional-statements,Javascript,Conditional Statements,我有一个字段需要以多种格式接受城市/州的输入值,包括city ST(伊利诺伊州芝加哥)、city,ST(伊利诺伊州芝加哥)和city,ST(伊利诺伊州芝加哥-之间无空格)。我们正在测试逗号或空格的最后一个实例后的两个字母的状态代码(因为城市名称可以有空格) 我有下面的代码,它使应该传递的值失败,反之亦然 var x = "Chicago,IL"; if ( (isNaN(x) && x.indexOf(' ') < 0 && x.split(" ").p
city ST
(伊利诺伊州芝加哥)、city,ST
(伊利诺伊州芝加哥)和city,ST
(伊利诺伊州芝加哥-之间无空格)。我们正在测试逗号或空格的最后一个实例后的两个字母的状态代码(因为城市名称可以有空格)
我有下面的代码,它使应该传递的值失败,反之亦然
var x = "Chicago,IL";
if (
(isNaN(x) && x.indexOf(' ') < 0 && x.split(" ").pop().length > 2) ||
(isNaN(x) && x.indexOf(',') > 0 && x.split(",").pop().trim().length > 2)
) {
alert("fail");
}
else {
alert("pass");
}
但是失败的Chicago,IL
(最初输入时没有空格)。我认为OR(II
)有问题的原因是,如果我删除第一部分并只测试包含逗号的值,Chicago,IL
通过。我认为OR条件句只在OR两边都为false时返回false,但这里的情况似乎不是这样
我确信这是一件非常简单的事情,但我盯着它看了太久,就是看不见它。这是真的:
我认为,或条件句只返回false,如果
或者是假的
关于这一点:
如果我删除第一部分并只测试包含逗号的值,则IL通过
在您的fiddler示例中,注释掉第一个测试将显示“fail”,这意味着它的计算结果为true
JS ORs没有问题。但是你期望的是什么呢?这似乎太复杂了。如果您打算这样做,请使用多个语句(这样可以更容易地对它们进行推理)。无论如何,这里是我的“解决方案”,不可否认,它并没有试图解决为什么最初的解决方案没有按预期工作:
var cityState = /^\w+(?:,\s*|\s+)\w{2}$/;
if (cityState.test(input)) {
// good
}
<接受“城市名称、国家”或“城市名称状态”,请考虑这个(更复杂)的正则表达式。这项工作的关键是惰性修改器和锚定
function isValidState (st) {
// This could be turned into an appropriate whitelist, and may include
// things like "Illinois".
return st.length == 2;
}
function parseCityState (cs) {
var match = cs.match(/^\s*(\w.*?)\s*([, ])\s*(\w+)\s*$/) || [];
var city = match[1];
var commaUsed = match[2] == ',';
var state = match[3];
if (city && state && isValidState(state)) {
return {city: city, state: state, commaUse: commaUsed}
} else {
return undefined;
}
}
现在,如果你对原著失败的原因感兴趣,考虑一下为什么“芝加哥,IL”失败的最新分析。让
x=“芝加哥,伊利诺伊州”
,然后:
isNaN(x) -> true
x.indexOf(' ') -> >0
x.indexOf(',') -> >0
x.split(' ') -> ["Chicago,", "IL"]
x.split(',') -> ["Chicago", " IL"]
并代以:
true && (>0 < 0) && ["Chicago,", "IL"].pop().length > 2
||
true && (>0 > 0) && ["Chicago", " IL"].pop().trim().length > 2
和再次求值(请注意,两个表达式行都失败,因为“IL”的长度仅为2):
最终,这会拒绝输入:
false || false -> false
我想你在这条线上有个错误
x.indexOf(“”)<0
应该是
x.indexOf(“”)>0
但如果我是你,我会使用正则表达式:
var info = 'South Beach, FL';
var regex = /\w+(\w+ \w+)*\s*,\s*[a-zA-Z]{2}/;
alert(regex.test(info) ? 'Valid' : 'Invalid')
我认为正则表达式在这里是合适的。你为什么要在这里执行isNaN测试?假设您从文本字段中获取一个值,它应该始终是一个string@jackweirdy但isNaN(“1”)仍然会产生错误。也许她只是想丢弃数字字符串?
x.indexOf(“”)<0&&x.split(“”).pop().length>2
没有意义。如果字符串中有空格,x.indexOf(“”)<0
为false
,第二个表达式将不会执行。如果没有空格,x.split(“”
将返回一个包含一个元素的数组,x
本身。你是说x.indexOf(“”)>0
是吗?@LexLythius-是的,我们处理的是不同区块中的数字字符串,因为用户可以输入邮政编码或城市/州。我们只想在城市/州的情况下运行这段测试。我同意你的观点,这里的方法是使用RegExps,但我认为OP需要一些关于JS逻辑的更基本的东西。谢谢你的解释。我想使用您的正则表达式,但它不考虑城市名称中可能的空格。例如,芝加哥国际机场通过,但芝加哥高地国际机场不通过。如果有逗号也不起作用(伊利诺伊州芝加哥高地失败)。@user2246674-我没有选择如何做;客户端提供了非常具体的处理状态和邮政编码的方法。@EmmyS我用一个使用正则表达式的示例更新了代码,但可以处理所描述的更复杂的情况。如果需要处理更多的规则(为了不让正则表达式变得不可读),那么创建一个调度函数可能会很有用,该函数将根据对输入的启发调用正确的“解析器”。作为一个基本示例,isNaN
检查可以是dispatcher的一部分-我们处理的是邮政编码还是类似于城市/州字符串的东西?祝你好运
true && false && false
||
true && true && false
false || false -> false
var info = 'South Beach, FL';
var regex = /\w+(\w+ \w+)*\s*,\s*[a-zA-Z]{2}/;
alert(regex.test(info) ? 'Valid' : 'Invalid')