IndexOf 和数组 - 优化此 jQuery 代码的最佳方法是什么?
IndexOf and Arrays - What's the best way to optimize this jQuery code?
我有一些 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
}
我想尽量减少我的代码,我认为按照这些行使用 一些东西 也会减少编写的代码量。
由于人们混淆了我的需要并提供了相反的东西(搜索 URL 数组而不是数组 URL)- 我想澄清一下。
我的数组可能包含 'somesite.com/subdir' 之类的内容,因此我无法将 URL 与数组匹配 - 我需要将数组与 URL 匹配。我需要查看数组中的任何内容是否在当前 URL 中(然后执行一个案例),而不是相反。
IE:'somesite.com/subdir'是否包含在当前URL中?当前URL中是否有'someothersite.com'?前者执行case 0,后者执行case 1。如果两者都不是,则为 -1。
根据这里的评论和讨论,我修改了答案。首先,JavaScript中有两个indexOf
方法。一种是 String Method indexOf
, it returns the position of the first occurrence of a specified value in a string. Second is the Array Method indexOf
,它在数组中搜索指定的项目,returns 它的位置。
第一个答案为您提供了数组方法作为解决方案,但您需要的是字符串方法的扩展版本。由于您不能原生使用数组作为 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 循环 (though we could)。
我有一些 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
}
我想尽量减少我的代码,我认为按照这些行使用 一些东西 也会减少编写的代码量。
由于人们混淆了我的需要并提供了相反的东西(搜索 URL 数组而不是数组 URL)- 我想澄清一下。
我的数组可能包含 'somesite.com/subdir' 之类的内容,因此我无法将 URL 与数组匹配 - 我需要将数组与 URL 匹配。我需要查看数组中的任何内容是否在当前 URL 中(然后执行一个案例),而不是相反。
IE:'somesite.com/subdir'是否包含在当前URL中?当前URL中是否有'someothersite.com'?前者执行case 0,后者执行case 1。如果两者都不是,则为 -1。
根据这里的评论和讨论,我修改了答案。首先,JavaScript中有两个indexOf
方法。一种是 String Method indexOf
, it returns the position of the first occurrence of a specified value in a string. Second is the Array Method indexOf
,它在数组中搜索指定的项目,returns 它的位置。
第一个答案为您提供了数组方法作为解决方案,但您需要的是字符串方法的扩展版本。由于您不能原生使用数组作为 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 循环 (though we could)。