我有一个对象。
var NavigationController = function(config) {
if(!config) {
config = {};
}
if(!config.routes) {
config.routes = {};
}
var getControllerByPath = function(path) {
// I need to get Controller (UserController) if path matches in routes (/user/me)
};
}
我可以用它作为......
var navController = new NavigationController({
routes : {
'/user/:action' : 'UserController',
'/app/:action' : 'AppController',
'/file/:action' : 'FileController',
'/feedback/:action' : 'FeedbackController'
}
});
navController.navigate(req, res);
目前,我正在为每条路线生成正则表达式字符串,然后将其与路径字符串匹配,它是否有效但是效率如何?
答案 0 :(得分:0)
正则表达式似乎是解决此问题的好方法。您可以浏览并查找/和:但您也可以编写正则表达式而无需回溯,这可以帮助您提高性能。
如果你试图让它具有高性能,你将花费大量时间编写可能根本不需要的算法......你确定这是你的应用需要性能改进的地方吗?预优化通常是最常见的错误之一,您最好的选择可能是在您的应用中获取逻辑,然后尝试找出哪些部分很慢并优化它们。
我希望这有帮助!
编辑:我正在谈论的正则表达式的一个例子:假设问题是匹配字母串中的所有内容直到字母k,大多数人会建议:
。* K
但这匹配字符串如:“hijk”和“hijkhijkh”(分别匹配hijk,hijkhink)。这是因为这个正则表达式实际上是在说“抓住所有内容,看看最后一个字符是否为k。如果不是,请删除该字符并向后工作直到它变为真或没有剩下的字符。”
如果你想匹配第一个k,你可以这样做:
*·K
这说:“一次抓取一个角色,看它是否与模式匹配(以k结尾)。如果没有,继续抓取直到令牌匹配或直到没有任何东西匹配且找不到匹配。”
你可以利用它来一次抓取一个角色......贪婪的操作员立即扫描字符串,所以O(n)开始。我介绍的后一个版本可以有一个更好的最佳情况,因为它可以工作,直到找到第一个匹配...但你应该尝试使用你的应用程序和性能测试它们,如果这是一个瓶颈,因为它真的依赖于您的应用在平均情况下使用的数据类型。