IndexOf和Arrays - 优化这个jQuery代码的最佳方法是什么?

时间:2015-01-04 09:04:44

标签: jquery arrays google-chrome-extension switch-statement indexof

我有一些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匹配。我需要查看数组中的ANYTHING是否在当前URL中(然后执行一个案例),而不是相反。

IE:当前网址中是否包含'somesite.com/subdir'?当前网址中有“someothersite.com”吗?对于前者执行情况0,对于后者执行情况1。情况-1,如果两者都没有。

2 个答案:

答案 0 :(得分:1)

根据评论和讨论,这是我修改后的答案。首先,JavaScript中有两个indexOf方法。一个是String Method indexOf,它返回字符串中第一次出现指定值的位置。第二个是Array Method indexOf,它在数组中搜索指定的项目,并返回其位置。

第一个答案为您提供了Array方法作为解决方案,但您需要的是字符串方法的扩展版本。由于您无法将数组原生地用作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);

The new fiddle is here

答案 1 :(得分:0)

听起来你想要做的是执行一些代码,具体取决于子字符串(某个域)是否与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](); 
  }
})

这可能不是最佳的性能方式,因为我们在遇到匹配(though we could)时没有逃避forEach循环。