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 2

2 ответа:

Основываясь на комментариях и обсуждении, вот мой модифицированный ответ. Во-первых, в JavaScript есть два метода indexOf. Одним из них является метод String indexOf, возвращает позицию первого вхождения указанного значения в строку. Во-вторых, метод массива 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, когда мы сталкиваемся с совпадением (, хотя мы могли бы).