我的 JavaScript 数组包含类似这样的链接:
var urls = ['url1','url2','url3'];
if (urls.indexOf(window.location.hostname) > -1)
{
// do something ...
}
else {
window.location.href = 'redirect url';
}
这段代码运行良好,但我尝试将其转换为这样的对象数组:
var urls = [
{
'url':'url1'
},
{
'url':'url2'
},
{
'url':'url3'
},
];
if (urls.url.indexOf(window.location.hostname) > -1)
{
// do something ...
}
else {
window.location.href = 'redirect url';
}
但是这个代码不起作用!!
如何将第一个代码转换为对象数组,或者如何在数组中搜索?
最简单的解决方案是使用 array.some
if(urls.some(function(item) { return item.url == window.location.hostname;})) {
// do something ...
} else {
window.location.href = 'redirect url';
}
更易读
var found = urls.some(function(item) {
return item.url == window.location.hostname;
});
if(found) {
// do something ...
} else {
window.location.href = 'redirect url';
}
首先:
urls
变量的两个定义都是 JSON:
url
作为字符串。为了搜索第二个,您需要显式迭代对象数组并显式比较属性(作为一种方法):
var found = false;
for ( var n = 0; n < urls.length; n++ )
{
if ( urls[n].url == window.location.hostname )
{
/// do something
found = true;
break;
}
}
if ( !found )
{
// do something other
}
或者可能是
if(urls.map(function(obj){ return obj.url}).indexOf(window.location.hostname)>0){
// do something ...
}
else {
window.location.href = 'redirect url';
}
使用 lodash 版本 4 或更高版本,您可以执行以下操作:
if (_(urls).map('url').includes(window.location.hostname)) {
// do something...
} else {
window.location.href = 'redirect url';
}
当涉及对象数组时,您无法像在代码中所做的那样访问元素。您必须使用循环来遍历元素或内置函数,例如filter,map。如果不使用内置函数,您可以执行类似的操作来完成工作。
在数组中搜索特定 url 的函数
function findURL(array,url) {
for (var i = 0; i < array.length; i++) {
if (array[i].url == url) {
return i;
}
}
return -1;
}
将下面的代码放在您要检查条件的位置
var urls = [
{
'url':'url1'
},
{
'url':'url2'
},
];
if(findURL(urls,window.location.hostname) > -1){
//do something ..
}else{
window.location.href = 'redirect url';
}
有一些答案描述了如何在您的场景中应用过滤器和映射方法。因此我认为我不想将它们放在我的答案中。
如果您使用 jquery,有一个名为 grep 的函数,它返回找到的项目数组。
var urls = [
{
'url':'url1'
},
{
'url':'url2'
},
];
var result = $.grep(urls, function(e){ return e.url == window.location.hostname; });
if (result.length == 0) { // nothing found
window.location.href = 'redirect url';
} else if (result.length == 1) { // one item found
//do something ..
// you can access the found item by result[0].foo if you want
} else { // multiple items found
}