我有一个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."
}
}
这样做的最佳方式是什么?
谢谢!
答案 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)
会返回item
中array
的索引,如果找不到则会-1
。
~x
相当于-x-1
。当且仅当true
时,它才会返回x != -1
。