【问题标题】:Javascript if statement with multiple permissible conditions [duplicate]具有多个允许条件的Javascript if语句[重复]
【发布时间】:2012-12-19 01:22:03
【问题描述】:

可能重复:
Javascript: The prettiest way to compare one value against multiple values
Javascript If statement used to check file extensions not working

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

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

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

【问题讨论】:

    标签: javascript


    【解决方案1】:

    你可以使用这样的数组:

    var extensions = ["jpg", "png", "gif"];
    
    if (extensions.indexOf(aExtensions[i].toLowerCase()) > -1) {
        // match
    }
    

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

    旧版浏览器不支持indexOf,因此您需要包含polyfill 来备份它。有几种解决方案。

    当然,如果你只想使用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
    }
    

    但请注意,您将永远无法单独取回扩展程序,这就是为什么我更喜欢我给出的前两个选项之一。

    【讨论】:

      【解决方案2】:

      正则表达式呢?

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

      【讨论】:

      • +1 - 在这些情况下,我绝对更喜欢正则表达式。
      • 好答案。你能在这里解释一下i的用途吗?
      • iRegExp 的不区分大小写标志
      • 有趣。谢谢@PaulS。
      【解决方案3】:

      另一种方法是使用像这样的对象字面量,

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

      通过这种方式,您可以查看匿名对象{'jpg':1,'png':1,'gif':1} 是否具有if 为真的属性。 1 符合这一点,undefined 没有。


      如果您正在使用一个对象,您还可以使用in operator(正如Ian 所指出的那样),如果该对象具有与其价值无关的这样一个键,则它会给出true

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

      这次请注意'jpg' 仍然通过'jpg':0

      【讨论】:

      • 您能解释一下{'jpg':1,'png':1,'gif':1} 在这种情况下的作用吗?以前从未在 if 语句中见过它。
      • @Jascination 我的编辑是否充分解释了它?
      • 在这种情况下你也可以使用if (aExtensions[i].toLowerCase() in {'jpg':"",'png':"",'gif':""})
      • @PaulS:in operatorfor-in statement 完全分离且完全无关。 in 运算符仅返回命名属性是否存在于对象上或对象的原型链中。
      • 另外,+1 这是解决此问题的最有效方法。遍历数组很慢;对象键查找速度非常快。
      【解决方案4】:

      您可以使用变量和三元组比较,但这很难看。

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

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

      然而,对于复杂的 != -1 比较以及旧版 IE 中缺少原生 indexOf,人们倾向于使用正则表达式:

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

      【讨论】:

        猜你喜欢
        • 2016-12-13
        • 2014-10-20
        • 2017-09-28
        • 1970-01-01
        • 2023-03-31
        • 1970-01-01
        • 2012-09-02
        • 1970-01-01
        相关资源
        最近更新 更多