【问题标题】:IndexOf and Arrays - What's the best way to optimize this jQuery code?IndexOf and Arrays - 优化此 jQuery 代码的最佳方法是什么?
【发布时间】:2015-01-04 09:04:44
【问题描述】:

我有一些 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 和数组按照 switch case 的方式做一些事情。也许类似于这个伪代码的内容?

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
} 

我想最小化我的代码,我认为在这些方面使用 something 也会减少编写的代码量。

由于人们混淆了我需要的内容并提供了相反的内容(根据数组搜索 URL,而不是根据 URL 搜索数组)- 我想澄清一下。

我的数组可能包含“somesite.com/subdir”之类的内容,因此我无法将 URL 与数组匹配 - 我需要将数组与 URL 匹配。我需要查看数组中的任何内容是否在当前 URL 中(然后执行一个案例),而不是相反。

IE:“somesite.com/subdir”是否包含在当前 URL 中?当前 URL 中是否有“someothersite.com”?前者执行case 0,后者执行case 1。如果两者都不是,则为 -1。

【问题讨论】:

  • “有一个真正的 switch/case 语句”是什么意思? developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…。你的第二个问题:基于一个基本条件,如果设置了另一个条件,你必须运行一个方法两次,否则只运行一次?
  • 来晚了,我想我弄错了。是的,如果 z & y,我想运行一个方法两次,如果是 y,我想运行一次。但在实际代码中,我在 y 之前的 z 条件之后有更多代码。
  • 请阅读您自己的 cmets。有一次你写道:'我要求 Z,然后执行一些代码。然后我检查 Y,但即使 Z 存在,Y 也可能不存在。在这种情况下,我根本不想要 x()。在这里你说:'如果 z & y,我想运行一个方法两次,如果 y,我想运行一次。'
  • 我可能只是因为迟到而发疯。你就在这里。我相信您对我的第二个代码部分的解决方案是正确的。

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


【解决方案1】:

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

第一个答案为您提供了 Array 方法作为解决方案,但您需要的是 string 方法的扩展版本。由于您不能使用原生数组作为 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.

【讨论】:

  • 我会看看你对我第一个问题的回答。但是第二个不起作用,因为我不想要 x();仅当满足 z 时才会发生。我也不能只做 z & y 条件,因为在 y 条件之前我有更多代码。
  • @Thirk 给你第二个 - 但这就是你目前所做的?你问 Z,如果存在,你问 Y 是否存在,在这种情况下你调用 X 两次,否则一次?
  • 看来第一位也是不行的。我需要将当前选项卡的 URL 与一组站点进行比较,然后根据 url 做出不同的响应。您的位显示我“手动”提供了一个 URL,如果我只搜索部分匹配(indexOf 'google.com' vs 'google.com/q?=etc')之类的东西,这将不起作用。
  • 我要求 Z,然后执行一些代码。然后我检查 Y,但即使 Z 存在,Y 也可能不存在。在这种情况下,我根本不想要 x()。
  • 您对问题一的回答与我所需要的相反。您提供了检查当前 URL 是否在数组中的代码 - 而不是数组是否包含当前 URL。对于部分匹配和站点子目录等内容,我需要后者。简单地将 checkTabURL 的参数更改为 window.location 并不能解决这个问题。不过感谢您的帮助。
【解决方案2】:

听起来您想要做的是根据子字符串(某个域)是否与 URL 字符串匹配来执行一些代码。

一堆 if/else 块工作。如果您有 很多 字符串,将其组织成子字符串到函数的映射可能会更简洁一些。有点像...

siteToFunction = {
  'example.com': function() {
    console.log('foo');
    console.log('bar');
  },
  'example2.com': function() {
    console.log('foo');
    console.log('bar');
  }
}

然后,我们可以遍历object/map中的每一个key,检查是否匹配当前url,然后取value,也就是一个函数,调用它。

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 循环 (though we could)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-09-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-09
    • 1970-01-01
    • 2020-07-09
    • 1970-01-01
    相关资源
    最近更新 更多