检查开关盒内的大量情况

时间:2016-11-27 17:41:45

标签: javascript switch-statement

我有一个switch语句,并且每个案例都有大量案例。

这是我到目前为止所拥有的。

exports.message = function message(message) {
  switch (message.toLowerCase()) {
    case "un":
    case "one":
    case "uno":
    case "um":
    case "unus":
    case "ano":
    case "un":
    //100 + other cases...
      return "Returned msg here"
    break;

    default: return "Sorry, I didn't quite understand that."

  }
}

在互联网上寻找答案之后,我能找到的就是所有这些,但这对我没有用。

由于我的一些案件有多达200种不同的“案例”,我正在寻找另一种方式。这样做不仅是丑陋的,长的(只有200行),但如果我想改变任何东西,也难以操纵。

我最喜欢这样的事情:

exports.message = function message(message) {
  switch (message.toLowerCase()) {
    case ["un", "one", "uno", "um", "unus", "ano", "un", /* 100+ other cases...*/]
      return "Returned msg here"
    break;

    default: return "Sorry, I didn't quite understand that."

  }
}

这样做的最佳方式是什么?

谢谢!

3 个答案:

答案 0 :(得分:0)

您可以使用哈希表,例如

{
    un: true,
    one: true,
    uno: true,
    // ...
}

使用

进行访问
if (hash[message.toLowerCase()]) { // ...

或数组,如

[
    "un", "one", "uno", "um", "unus", "ano", "un"
]

使用

进行访问
if (array.indexOf(message.toLowerCase()) !== -1) { // ...

答案 1 :(得分:0)

我建议将每个case中的单词放入数组对象中,然后使用Array.indexOf(caseWord) > -1查看Aray中是否存在该单词,例如:

var equivalentWordsFor = {
      'one' : ["un", "one", "uno", "um", "unus", "ano", "un"]
}

if (equivalentWordsFor.one.indexOf(message) > -1) {
    return "Returned message here.";
}

Array.prototype.indexOf()返回被调用的数组中提供的字符串的索引;因为这可以包括0(JavaScript数组的第一个元素的索引),任何包含零的正数表示找到的匹配,而-1表示找不到提供的字符串。

也可以使用Array.prototype.some()

var equivalentWordsFor = {
      'one' : ["un", "one", "uno", "um", "unus", "ano", "un"]
}

if (equivalentWordsFor.one.some(

    // 'word' is a reference to the current Array-element of the
    // Array over which we're iterating.

    // if 'word' is precisely equal to 'msg' the result is
    // of course 'true' and 'false' if not; if any element
    // satisfies this assessment Array.prototype.some() returns
    // true to the calling context, otherwise - if no element
    // satisfies the assessment - the method returns false:
    word => word === msg
)) {
    return "Returned message here.";
}
如果提供的参数为数组中的任何元素返回Array.prototype.some(),则

true返回布尔值true,如果找不到与提供的参数匹配的元素,则返回false

显然,这两种方法都需要另外一个数组用于'两个'字等价,依此类推,但它应该比使用switch () {...}的等效方法更易于维护。

参考文献:

答案 2 :(得分:0)

您可以通过以下方式执行此操作:

var msg = message.toLowerCase()
if (~["un", "one", "uno", "um", "unus", "ano", "un", ...].indexOf(msg)) {
    // do something
} else if (~["deux", "two", "dos", ...].indexOf(msg)) {
    // do something else
} ...

请注意,如果您遇到性能瓶颈,则需要将最常见的案例放在开头。

您可能还希望首先从列表中删除重复项以获得更好的性能(您发送的重复项包含“un”两次)。

array.indexOf(item)会返回itemarray的索引,如果找不到则会-1

~x相当于-x-1。当且仅当true时,它才会返回x != -1