Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/461.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/.htaccess/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
javascript或(| |)未返回预期结果_Javascript_Conditional Statements - Fatal编程技术网

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')