索引和搜索成千上万条件的有效方法?

时间:2013-12-13 17:53:59

标签: javascript performance node.js conditional-statements

我一直在用JavaScript编写一个简单的聊天机器人作为练习和乐趣。我希望能够建立它,并在我进行时重构它。

实际上,每次读取新消息时循环的搜索功能对于查找数千个条件都是低效的。

这是代码。每个单词都是一个数组值,它会搜索匹配的大小写。

function simpleReactSearch(handle, msg, pureMsg, priv) {
    if (msg[0] === "hooray") {
        switch (msg[1]) {
            case "hi":
            case "hello":
            case "greetings":
            case "howdy":
            case "welcome":
            case "hiya":
            case "hi-ya":
            case "aloha":
                return commonReact("greeting", handle, priv);
            case "ohayou":
            case "morning":
                return commonReact("morning", handle, priv);
            case "bonjour":
            case "konbanwa":
                break;
            case "konnichiwa":
                break;
            case "oyasuminasai":
                break;
            case "goodbye":
            case "seeya":
                break;
            case "sayonara":
                break;
            case "echo":
                pureMsg.splice(0,2);
                return "Echo: "+pureMsg.join(' ');
            case "say":
                pureMsg.splice(0,2);
                return pureMsg.join(' ');
        }       
        switch (msg[1]+" "+msg[2]) {
            case "good morning":
                break;
            case "good afternoon":
                break;
            case "good night":
                break;
            case "good evening":
            case "buenas noches":
                break;
            case "good day":
            case "buenos dias":
                break;
            case "dewa mata":
            case "see ya":
            case "see you":
                break;
        }
    }
}

我已经读过,对于这种类型的搜索,数组查找更有效,但即使这对于循环中的数千个条件似乎也不实用。那么,那会是最好的吗?

我在考虑将这些案例和条件存储在配置文件中以便于编辑,但这样效率会更低吗?

我认为,解决这个问题的一种方法是添加各种数据库。如果可能的话,我宁愿不去那条路。

现在我可以看到一种方法可以让它更有效率,那就是只搜索某些开关组,如果句子有适量的单词或特定单词。

总结:

将switch case组转换为数组会不会更好,或者Node.js能否以相同的效率处理数组和switch语句?

除了基本的选择性搜索之外,还有其他方法可以提高效率吗?

1 个答案:

答案 0 :(得分:1)

您可以使用一些地图。

所以创建你想要的动作,func1,func2等(使用更具描述性的名字)

然后将它们添加到这样的地图

var map = {
    "hi": func1,
    "hello": func1,
    "test": func2,
    "whatever": func3
}

然后你可以做

if(msg[0] === "hooray") {
    map[msg[1]]();
}
else
{
     map2[msg[0]+" "+msg[1]]();
}