2012-04-30 2 views
2

Я пытаюсь проверить соответствие в массиве с помощью 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().

ответ

1

Ваша переменная «сайты» должен быть регулярным выражением, а не массив:

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) 
    ...... 
+0

Спасибо, это работает, когда вы конвертированы йо РегВыр: D – Luis

+0

** Не забывайте экранировать специальные символы RegEx * * Точка не является единственным специальным символом. '.replace (/ [[^ $. |? * +() {} \\]/g, '\\ $ &');' –

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 ] 

Источник: Underscore.js

Так что теперь ваш код будет выглядеть следующим образом:

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 

} 
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);

+0

см. примечание в обновлении. – Luis

+0

@ Luis попробуйте сейчас ...... –

Смежные вопросы