IndexOf и массивы-как лучше всего оптимизировать этот код jQuery?
У меня есть некоторый код jQuery, который делает некоторые определенные вещи на определенных веб-страницах и не загружается на других. Вот мой текущий метод выполнения указанного кода:
if ((window.location.href).indexOf('somewebsite.com') >= 0){
chrome.extension.sendMessage({greeting: "loadscript"});
var stuff = new Stuff();
//run some code
dothiseverytime(withSomeParams);
} else if ((window.location.href).indexOf('someotherwebsite.com') >= 0){
chrome.extension.sendMessage({greeting: "loadscript"});
var stuff = new Stuff();
//run some code
dothiseverytime(withDifferentParams);
} else if
// etc..
Мне интересно, могу ли я сделать что-то наподобие случая коммутатора, используя indexOf и массив. Может быть, что-то вроде этого псевдокода?
someWebsites = ['somewebsite.com','someotherwebsite.com']
function checkTabURL {
switch ((window.location.href).indexOf(someWebsites) >= 0)
case 0 // first site in our list - index 0
var stuff = new Stuff();
// do some stuff
case 1 // second site on our list - index 1
var stuff = new Stuff();
// do some other stuff
case -1 // site isn't on the list
// don't do anything
}
Я хотел бы минимизировать свой код, и я думаю, что использование чего-то в этих строках уменьшит количество кода, написанного как хорошо.
Поскольку люди путают то, что мне нужно, и предоставляют противоположное (поиск URL по массиву вместо массива по URL) - я хотел бы уточнить.
Мой массив может содержать такие вещи, как 'somesite.com/subdir поэтому я не смог сопоставить URL-адрес массива - мне нужно сопоставить массив URL-адрес. Мне нужно посмотреть, есть ли что-нибудь в массиве в текущем URL (и затем выполнить обращение), а не наоборот.
IE: Is 'somesite.com/subdir" содержится в текущий URL? Это 'someothersite.com - в текущем URL-адресе? Выполните случай 0 для первого, случай 1 для второго. Корпус 1, Если ни.
2 ответа:
Основываясь на комментариях и обсуждении, вот мой модифицированный ответ. Во-первых, в JavaScript есть два метода
indexOf
. Одним из них является метод StringindexOf
, возвращает позицию первого вхождения указанного значения в строку. Во-вторых, метод массиваindexOf
, который ищет в массиве указанный элемент и возвращает его позицию.Первые ответы предлагали вам метод массива в качестве решения, но вам понадобится Расширенная версия строки метод. Поскольку вы не можете использовать массив изначально в качестве параметра для метода String, вам нужно будет создать пользовательский метод:
/** * Extend the Array object * @param needle The string to search for * @returns Returns the index of the first match or -1 if not found */ Array.prototype.searchFor = function(needle) { for (var i=0; i<this.length; i++) if (this[i].indexOf(needle) == 0) return i; return -1; };
С помощью этого метода (или аналогичного) вы можете проверить, является ли одна строка (Ваш URL) частичным или полным соответствием элемента данного массива.
var someWebsites = ['somewebsite.com/subdirectory','someotherwebsite.com']; function checkTabURL(url) { switch (someWebsites.searchFor(url)) { case 0: console.log('case 0'); break; case 1: console.log('case 1'); break; // you can also combinate different cases: case 2: case 3: // do your stuff here break; default: console.log('default'); break; } } // for testing: logs 0 (case 0) // since somewebsite.com is indexOf somewebsite.com/subdirectory checkTabURL('somewebsite.com'); //checkTabURL(window.location.href);
Похоже, что вы хотите выполнить некоторый код в зависимости от того, соответствует ли подстрока (некоторый домен) строке URL.
Работает куча блоков if/else. Если у вас есть Много строк, было бы немного аккуратнее организовать их в отображение подстрок в функции. Что-то вроде того...
siteToFunction = { 'example.com': function() { console.log('foo'); console.log('bar'); }, 'example2.com': function() { console.log('foo'); console.log('bar'); } }
Затем мы можем перебрать каждый ключ в объекте / карте, проверить, соответствует ли он текущему url, а затем взять значение, которое является функцией, и вызвать оно.
var url = window.location.href; Object.keys(siteToFunction).forEach(function(site) { // if the current site matches the current url, run its associated function if (url.indexOf(site) > -1) { siteToFunction[site](); } })
Это может быть не самым оптимальным способом с точки зрения производительности, так как мы не выходим из цикла forEach, когда мы сталкиваемся с совпадением (, хотя мы могли бы).