【问题标题】:What is a better way of testing if a string doesn't equal a bunch of stuff? [duplicate]如果字符串不等于一堆东西,有什么更好的测试方法? [复制]
【发布时间】:2013-08-05 20:54:06
【问题描述】:

现在我有:

if (breadCrumbArr[x] !== 'NEBC' && breadCrumbArr[x] !== 'station:|slot:' &&  breadCrumbArr[x] !== 'slot:' &&  breadCrumbArr[x] !== 'believe') {
    // more code
}

但我认为这可以做得更好......

【问题讨论】:

标签: javascript


【解决方案1】:

创建一个数组并使用indexOf:

['NEBC', 'station:|slot:', 'slot:', 'believe'].indexOf(breadCrumbArr[x]) === -1

【讨论】:

  • +1 - 并忽略 IE 8-。
  • 或者,如果可以的话,您可以使用 JQuery 的 $.inArray(string_name, array_name)
  • @JimmiTh 不需要忽略它。只需include a polyfill
  • 在 2 分钟内获得 8 个赞
  • 我应该指出,.indexOf() 给出的结果与!== 不同,因此这在功能上不等同于 OP 的原始代码。
【解决方案2】:

您可以使用switch 声明:

switch(inputString){
  case "ignoreme1":
  case "ignoreme2":
  case "ignoreme3":
    break;
  default: 
    //Do your stuff
    break;
}

【讨论】:

  • +1 以提高该解决方案的可读性
  • @JonathanM 由于值是硬编码的,所以 -1 缺乏灵活性怎么样?
  • @JonathanM 我同意硬编码值不好......但这是问题所采用的方法,因此我就是这样解决它的。
  • 抱歉标签不好 - 最后一条评论是给@Christophe的
  • @JonathanM 查看其他答案。如果将值存储在数组或对象中,则可以编写添加/删除/更新值的代码。如果您在 case 语句中有值,则无法在运行时更改它们。 (为了记录,我对否决票并不认真!)
【解决方案3】:

除了 Blender 的回答:如果你想跨浏览器,你也可以使用对象而不是数组:

var words = {
    'NEBC': true, 
    'station:|slot:': true, 
    'slot:': true, 
    'believe': true
};

if (!words[breadCrumbArr[x]]){
    //do stuff
}

它也更快,但也更难看,因为您必须为每个用作属性名称的字符串分配一个值(在本例中为 true)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-03
    • 1970-01-01
    • 1970-01-01
    • 2017-05-26
    • 2022-09-23
    • 1970-01-01
    相关资源
    最近更新 更多