2014-10-06 16 views
0

如果检测到一个关闭多个浏览器,我想启动一个脚本。我做了一个常规数组,我想检查它们是否存在于navigator.userAgent字符串中。我想用下划线去做而不是每一个。Ellegant在数组中找到regEx

var browsers = [/chrome/, /opera/]; 
/* something like: */ 
if (!_.contains(browsers, navigator.userAgent.toLowerCase()) return; 
+1

您_do_明白,强调只是通过所有元素循环的东西,如一个'for',对?我当然是 – Cerbrus 2014-10-06 08:04:14

+0

。我只是想让我的代码更漂亮 – 2014-10-06 08:06:05

+1

好吧。在那种情况下,如果你想用下划线来做,你会在寻找['_.some()'](http://underscorejs.org/#some)。然而,dystroy的答案要好得多(更快,更干净,更短...)。 – Cerbrus 2014-10-06 08:07:37

回答

2

使用_.some()

if (!_.some(browsers, function(item){ 
    return navigator.userAgent.toLowerCase().test(item); 
}) return; 

不过,我会建议使用@dystroy's single-regex solution。它速度更快,代码更短。

你可以是这样做的:

var arr = ["chrome", "opera"]; // Strings, not regexes. 
var regexp = new RegExp(arr.join('|'), 'i'); 
if (!regexp.test(navigator.userAgent)) return; 

或者,作为一个班轮:

if (!RegExp(["chrome", "opera"].join('|'), 'i').test(navigator.userAgent)) return; 
2

更好的解决方案是只有一个正则表达式,这样就不必迭代。并使用i标志可以让你避免toLowerCase

if (!/chrome|opera/i.test(navigator.userAgent)) return; 
+0

好的解决方案。但我需要使用数组,这来自数据库。那么如何在你的代码中实现一个数组? if(!/ + arr.join('|')+ /i.test(navigator.userAgent))return; – 2014-10-06 08:22:01

+0

如果你有一个数组,请使用_some,就像Cerbrus所说的那样,不要试图构建一个复合正则表达式。但至少可以说,在数据库中这样做是非常令人怀疑的。您的应用程序的设计看起来不正确。 – 2014-10-06 08:25:07