问题 具有多个允许条件的Javascript if语句[重复]


可能重复:
Javascript:将一个值与多个值进行比较的最漂亮的方法
Javascript If用于检查文件扩展名的语句不起作用 

在JS中我试图检查扩展是否以“png”“jpg”或“gif”结尾。我知道这可以通过switch语句来完成,但我想知道是否有一种更简单的方法可以将它全部丢弃 if 有条件的。喜欢:

    if (aExtensions[i].toLowerCase() == ('jpg' || 'png' || 'gif')) {}

实现这一目标的最佳方法是什么?


1174
2017-12-19 01:22


起源



答案:


你可以使用这样的数组:

var extensions = ["jpg", "png", "gif"];

if (extensions.indexOf(aExtensions[i].toLowerCase()) > -1) {
    // match
}

在这种情况下,您存储“有效”扩展名。然后,你可以使用 indexOf 的方法 Array 查找数组中的任何项是否与您正在查看的特定扩展名匹配 - 检查值是否为 0 或更高。

indexOf 旧浏览器不支持,因此您需要包含一个 填充工具 支持它。有几种解决方案。

当然,如果你只想使用 if 语句,你可以使用这种格式:

var ext = aExtensions[i].toLowerCase();
if (ext == "jpg" || ext == "png" || ext == "gif") {
    // match
}

我能想到的另一种可能性是 switch 声明,如:

var ext = aExtensions[i].toLowerCase();

switch (ext) {
    case "jpg":
    case "png":
    case "gif":
        // match
        break;
    case default:
        // No match
}

我不妨把它包括在内(其他答案首先是肯定的),但我能想到的另一个是使用正则表达式,如:

if (/jpg|png|gif/i.test(aExtensions[i])) {
    // match
}

但请注意,您永远无法单独获得扩展,这就是为什么我更喜欢我给出的前两个选项中的一个。


11
2017-12-19 01:22





正则表达式怎么样?

if ( /jpg|png|gif/i.test( aExtensions[i] ) ) {
  ...
}

2
2017-12-19 01:26



+1 - 在这些情况下我绝对更喜欢正则表达式。 - jAndy
好答案。你能解释一下这个目的吗? i 这里? - JVG
i 是 正则表达式不区分大小写的旗帜 - Paul S.
有趣。谢谢@PaulS。 - JVG


答案:


你可以使用这样的数组:

var extensions = ["jpg", "png", "gif"];

if (extensions.indexOf(aExtensions[i].toLowerCase()) > -1) {
    // match
}

在这种情况下,您存储“有效”扩展名。然后,你可以使用 indexOf 的方法 Array 查找数组中的任何项是否与您正在查看的特定扩展名匹配 - 检查值是否为 0 或更高。

indexOf 旧浏览器不支持,因此您需要包含一个 填充工具 支持它。有几种解决方案。

当然,如果你只想使用 if 语句,你可以使用这种格式:

var ext = aExtensions[i].toLowerCase();
if (ext == "jpg" || ext == "png" || ext == "gif") {
    // match
}

我能想到的另一种可能性是 switch 声明,如:

var ext = aExtensions[i].toLowerCase();

switch (ext) {
    case "jpg":
    case "png":
    case "gif":
        // match
        break;
    case default:
        // No match
}

我不妨把它包括在内(其他答案首先是肯定的),但我能想到的另一个是使用正则表达式,如:

if (/jpg|png|gif/i.test(aExtensions[i])) {
    // match
}

但请注意,您永远无法单独获得扩展,这就是为什么我更喜欢我给出的前两个选项中的一个。


11
2017-12-19 01:22





正则表达式怎么样?

if ( /jpg|png|gif/i.test( aExtensions[i] ) ) {
  ...
}

2
2017-12-19 01:26



+1 - 在这些情况下我绝对更喜欢正则表达式。 - jAndy
好答案。你能解释一下这个目的吗? i 这里? - JVG
i 是 正则表达式不区分大小写的旗帜 - Paul S.
有趣。谢谢@PaulS。 - JVG


另一种方法是使用这样的对象文字,

if ({'jpg':1,'png':1,'gif':1}[aExtensions[i].toLowerCase()]) {
    // ...
}

这样你就可以查看匿名对象了 {'jpg':1,'png':1,'gif':1} 有一个属性将是真实的 if1 满足这个, undefined 没有。


如果你正在使用一个对象,你也可以使用它 in 操作者 (正如所指出的那样) 伊恩) 这使 true 如果对象具有与其值无关的密钥。

if (aExtensions[i].toLowerCase() in {'jpg':0,'png':1,'gif':2}) {
    // ...
}

请注意这一次如何 'jpg' 尽管如此仍然过去了 'jpg':0


2
2017-12-19 01:27



你能解释一下吗? {'jpg':1,'png':1,'gif':1} 在这种情况下呢?之前在if语句中从未见过它。 - JVG
@Jascination让我的编辑充分解释了吗? - Paul S.
你也可以使用 if (aExtensions[i].toLowerCase() in {'jpg':"",'png':"",'gif':""}) 在这种情况下 - Ian
@PaulS:The in  操作者 与...完全分开,完全无关 for-in  声明。该 in operator只是返回对象或对象的原型链中是否存在命名属性。 - josh3736
另外,+1为 这是解决此问题最高效的方法。迭代数组很慢;对象键查找是 非常 快速。 - josh3736


你可以使用变量和三重比较,但那很难看。

或者你可以只使用一个数组并检查字符串是否包含在其中。

if (~ ["jpg", "png", "gif"].indexOf(aExtensions[i].toLowerCase()) …

然而,对于复杂的 != -1 比较和缺乏本土 indexOf 在旧版IE中,人们倾向于使用正则表达式:

if (/jpg|png|gif/i.test(aExtensions[i])) …

1
2017-12-19 01:26