我正在尝试使用 PURE JAVASCRIPT 检查数组中的匹配项。我不知道该怎么做,我很感激你的帮助。
var sites = new Array ("site1.com", "site2.com", "site3.com" ...);
// Sites array contains 100 values
var imgs = document.getElementsByTagName("img");
for (var i = 0; i < imgs.length; i++) {
img = imgs[i].src;
// I'm trying to check if is in array,
// and don't waste a lot of size in code
if(img.match(sites)){
notHere(imgs[i]);
}
// This is the working way.
// Even if location is a.site1.com/b/, it will match
if (img.match("site1.com")) {
heReload(imgs[i]);
}
// Repeat this piece of code 100 times
}
}
注意:我不想检查确切的值。我想模拟match()
函数,所以如果img =“http://a.b.c/d/”并且在数组中是“b.c /”,它就会执行function()
。
答案 0 :(得分:1)
过滤器的良好用例。
如果您想让它在“旧”浏览器上运行:
var nativeFilter = Array.prototype.filter;
_.filter = _.select = function(obj, iterator, context) {
var results = [];
if (obj == null) return results;
if (nativeFilter && obj.filter === nativeFilter) return obj.filter(iterator, context);
each(obj, function(value, index, list) {
if (iterator.call(context, value, index, list)) results[results.length] = value;
});
return results;
};
如果没有找到,它将返回一个空数组,否则返回一个包含结果的数组
> [1,2,3,4].filter(function(item) { return item == 4 } );
[ 4 ]
所以现在你的代码看起来像这样:
var sites = new Array ("site1.com", "site2.com", "site3.com" ...);
// Sites array contains 100 values
var imgs = document.getElementsByTagName( "img" );
for ( var i = 0; i < imgs.length; i++ ) {
var img = imgs[ i ].src;
var result = sites._filter( function( site ) {
return img.match( site )
});
// result is an array of matching sites
}
答案 1 :(得分:1)
您的“sites”变量应该是正则表达式而不是数组:
var sites = /\b(site1\.com|site2\.com|etc|etc)\b/
后:
if (img.match(sites))
......
如果由于某种原因您希望将“网站”保留在数组中,您还可以“动态”创建正则表达式:
var sites = ["site1.com", "site2.com", "site3.com"]
var sitesRegexp = new RegExp("\\b(" + sites.join("|").replace(".", "\\.") + ")\\b")
....
if (img.match(sitesRegexp)
......
答案 2 :(得分:0)
您可以扩展Array原型,因此它支持所有浏览器......
试试这个:
Array.prototype.myContains = function(obj) {
var i = this.length;
while (i--) {if (this[i] .indexOf(obj)>-1) return true; }
return false;
}
用法:var t=myArr.myContains(3);